Использование параметров в членах типа
Используйте параметры основного конструктора во всём типе.
«Использование параметров в членах типа» — бесплатный урок C# Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения C# Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс C# Academy содержит 4 уроков всего.
Использование параметров в членах класса
Возможности первичных конструкторов раскрываются при использовании параметров внутри членов класса: методов, свойств и инициализаторов полей. Компилятор организует необходимое хранение.
using System;
class Multiplier(int factor) {
public int Apply(int n) => n * factor;
}
Console.WriteLine(new Multiplier(3).Apply(5)); // 15Захват и использование только в инициализаторе
Если параметр используется только в инициализаторе поля или свойства, дополнительное хранилище не требуется. Если он используется в методе, компилятор захватывает его в скрытое поле.
using System;
class A(int x) {
public int Stored = x; // initializer only
}
class B(int x) {
public int Get() => x; // captured into a field
}
Console.WriteLine(new A(7).Stored); // 7
Console.WriteLine(new B(9).Get()); // 9Параметры можно изменять
Параметры первичного конструктора ведут себя как обычные параметры: внутри экземпляра их можно изменять, если не обращаться с ними как с доступными только для чтения. Изменение параметра меняет захваченное поле.
using System;
class Toggle(bool on) {
public void Flip() => on = !on;
public bool State => on;
}
var t = new Toggle(false);
t.Flip();
Console.WriteLine(t.State); // TrueПредоставление свойств только для чтения
Распространённый подход — предоставить параметр через свойство только для чтения, создав понятный публичный интерфейс и сохранив параметр внутренним.
using System;
class User(string email) {
public string Email { get; } = email;
}
Console.WriteLine(new User("a@b.com").Email); // a@b.comВычисляемые свойства на основе параметров
Параметры естественно использовать в вычисляемых свойствах с телом-выражением.
using System;
class Money(decimal amount, string currency) {
public string Display => amount.ToString("0.00") + " " + currency;
}
Console.WriteLine(new Money(9.5m, "USD").Display); // 9.50 USDПараметры в нескольких методах
Один и тот же захваченный параметр может использоваться несколькими методами, подобно закрытому полю, инициализированному при создании объекта.
using System;
class Range2(int lo, int hi) {
public bool Contains(int n) => n >= lo && n <= hi;
public int Clamp(int n) => Math.Max(lo, Math.Min(hi, n));
}
var r = new Range2(0, 10);
Console.WriteLine(r.Contains(5)); // True
Console.WriteLine(r.Clamp(15)); // 10Захват ссылочных типов
Захваченные параметры ссылочного типа позволяют сохранять внедрённые зависимости и вызывать их из любого метода.
using System;
using System.Collections.Generic;
class Repo(List<string> store) {
public void Add(string item) => store.Add(item);
public int Count => store.Count;
}
var list = new List<string>();
var repo = new Repo(list);
repo.Add("x");
Console.WriteLine(repo.Count); // 1Как избежать случайного двойного хранения
Если Вы и присваиваете параметр полю, и используете параметр в методах, значение может сохраниться дважды. Для ясности выберите один подход.
using System;
class Clean(int x) {
// expose once via property, reference property in methods
public int Value { get; } = x;
public int Doubled() => Value * 2;
}
Console.WriteLine(new Clean(4).Doubled()); // 8Параметры в лямбда-выражениях
Параметры могут захватываться лямбда-выражениями, определёнными внутри класса, так же как поля.
using System;
using System.Collections.Generic;
using System.Linq;
class Filter(int threshold) {
public IEnumerable<int> KeepAbove(IEnumerable<int> xs) =>
xs.Where(n => n > threshold);
}
var f = new Filter(3);
Console.WriteLine(string.Join(",", f.KeepAbove(new[]{1,2,3,4,5}))); // 4,5Область видимости и время жизни
Захваченный параметр существует столько же, сколько объект. Фактически это состояние экземпляра, поэтому не следует считать, что оно сбрасывается между вызовами методов.
using System;
class Accumulator(int seed) {
private int total = seed;
public int Add(int n) { total += n; return total; }
}
var a = new Accumulator(100);
Console.WriteLine(a.Add(1)); // 101
Console.WriteLine(a.Add(1)); // 102Собираем всё вместе
Этот сервис захватывает две зависимости и использует их в разных методах, показывая типичную форму кода из реальных приложений.
using System;
class PriceService(decimal taxRate, string currency) {
public decimal WithTax(decimal net) => net * (1 + taxRate);
public string Format(decimal v) => v.ToString("0.00") + " " + currency;
}
var s = new PriceService(0.2m, "EUR");
Console.WriteLine(s.Format(s.WithTax(100m))); // 120.00 EURБыстрая проверка
Проверьте, как сохраняются параметры основного конструктора.
Итоги
Вы узнали, как параметры основных конструкторов используются в членах типа.
- При использовании в методах параметры захватываются во внутренние поля.
- Если параметры используются только в инициализаторах, дополнительное хранение не требуется.
- Для удобного открытого интерфейса предоставляйте к ним доступ через свойства только для чтения.
- В течение времени жизни объекта они ведут себя как состояние экземпляра.
Часто задаваемые вопросы
Урок «Использование параметров в членах типа» бесплатный?
Да — полный текст урока «Использование параметров в членах типа» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс C# Academy, подпишись на CoddyKit PRO. Курс C# Academy содержит 4 уроков всего.
Чему я научусь в уроке «Использование параметров в членах типа»?
Используйте параметры основного конструктора во всём типе. Ты практикуешь C# Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать C# Academy?
Предыдущий опыт не требуется. C# Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Использование параметров в членах типа»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке C# Academy?
Да. Каждый урок C# Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Основные конструкторы классов
- Использование параметров в членах типа
- Основные конструкторы структур
- Сочетание со свойствами и базовыми типами