Нужно объявить поле, соответствующее свойству в 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 никогда не читается / не изменяется, это просто переменная уровня класса, которая ничего не делает.

Причина, по которой вы можете использовать первое, заключается в том, что вам нужно сделать что-то более сложное в методе получения / установки. Например, вы можете проверить, что-то инициализируется в геттере. Или вы можете проверить значение в установщике.

Другие вопросы по тегам