Нужно объявить поле, соответствующее свойству в C#?
В чем разница между
private string someText;
public string SomeText
{
get;
set;
}
а также
public string SomeText
{
get;
set;
}
4 ответа
Вообще ничего, ваш личный член не используется.
Компилятор скомпилирует
public string SomeText
{
get;
set;
}
в эквиваленте
private string _someText;
public string SomeText
{
get { return _someText; }
set { _someText = value; }
}
Вы понимаете, что ваш вопрос сравнивает две равные вещи? (
public string SomeText
{
get;
set;
}
)
Я думаю, что ваш вопрос на самом деле - в чем разница между
private string someText;
public string SomeText
{
get
{
return someText;
}
set
{
someText = value;
}
}
а также:
public string SomeText
{
get;
set;
}
На что ответ, во втором примере поля поддержки все еще существуют, но созданы для вас - и вы не имеете никакого влияния на установку / получение; тогда как в первом примере вы можете установить другие проверки, чтобы убедиться, что это допустимое значение и т. д.
Я думаю, может быть, вы хотите знать разницу между
public class Test1
{
private string _text;
public string Text
{
get { return _text; }
set { _text = value; }
}
}
а также
public class Test2
{
public string Text
{
get;
set;
}
}
Если вы разберете эти два класса в CIL, вы обнаружите, что они почти одинаковы, за исключением того, что во втором случае поле было сгенерировано автоматически.
Первый случай:
.property instance string Text
{
.get instance string Syner.Test1::get_Text()
.set instance void Syner.Test1::set_Text(string)
}
.field private string _text
Второй случай:
.property instance string Text
{
.get instance string Syner.Test2::get_Text()
.set instance void Syner.Test2::set_Text(string)
}
.field private string <Text>k__BackingField
{
.custom instance void [mscorlib]System.Runtime.CompilerServices.CompilerGeneratedAttribute::.ctor()
}
Второй просто синтаксический сахар для:
private string someText;
public string SomeText
{
get { return someText; }
set { someText = value; }
}
Второй автоматически обрабатывает создание переменных и т.д. для вас за кулисами. В вашем первом примере приватная переменная someText
никогда не читается / не изменяется, это просто переменная уровня класса, которая ничего не делает.
Причина, по которой вы можете использовать первое, заключается в том, что вам нужно сделать что-то более сложное в методе получения / установки. Например, вы можете проверить, что-то инициализируется в геттере. Или вы можете проверить значение в установщике.