Имя входящего параметра совпадает с именем поля

#c#

#c#

Вопрос:

 class  Person
{
  public string name;

  public void SetName(string name)
  {
    name = name;
  }
}    

public void static Main(string[] args)
{    
  Person aPerson = new Person();
  aPerson.SetName("ruby");

  Console.WriteLine("person name is {0}}, aPerson.name);
}
  

Имя пользователя пустое. Это можно устранить с помощью this.name = name;

По какой причине имя пользователя пустое (пустая строка)?

Комментарии:

1. Почему это не настоящий вопрос? Это вопрос новичка, но это вопрос настоящего новичка.

Ответ №1:

В настоящее время ваше назначение

 name = name;
  

просто присваивает значение параметра самому себе. Другими словами, это не операция.

Если вы измените его на:

 this.name = name;
  

тогда это присваивает значение параметра полю, что вы и предполагали.

Однако в настоящее время name поле пользователя не будет ссылаться на пустую строку — это будет нулевая ссылка. Между ними большая разница.

(Конечно, обычно у вас не должно быть открытого поля, и вы должны использовать свойство вместо SetName метода.)

Комментарии:

1. @Jon: возвращая параметр самому себе, можете ли вы рассказать, как это происходит и как это создаст нулевую ссылку

2. @Raghav55: Вы просто присваиваете значение, вот и все. Представьте, что это была int переменная: вы говорите «пусть значение переменной будет … значением переменной». Таким образом, это не дает ничего полезного.

3. @Jon : но почему установлена нулевая ссылка

4. @Raghav55: Значением по умолчанию для поля является нулевая ссылка. Поскольку исходный код не присваивает полю никакого другого значения, вы получили нулевую ссылку.

5. @jon: извините за многие вопросы public void setName(имя строки) { name = name } итак, компиляторы обрабатывают входящие параметры как локальную переменную, но почему ошибка компиляции не выдается

Ответ №2:

В методе

 public void SetName(string name) 
{ 
    name = name; 
}
  

вы устанавливаете не свое общедоступное поле, а параметр. Чтобы задать общедоступное поле, вы должны использовать

 public void SetName(string name) 
{ 
    this.name = name; 
}
  

Лучшим подходом является использование свойства:

 private string name;
public string Name
{
    get { return this.name; }
    set { this.name = value; }
}
  

Ответ №3:

Без использования this ключевого слова вы просто переназначаете значение параметра name самому параметру. this Ключевое слово предоставляет вам экземпляр для работы.

Лучшим подходом могло бы быть

 class Person
{
    public string Name { get; private set; }

    public Person(string name)
    {
        Name = name;
    }
}
  

Некоторым людям нравится использовать подчеркивание для закрытых полей-членов

 private string _name;
  

Ответ №4:

Вы присваиваете входной параметр (name) самому себе. Используя this.name = name вы явно присваиваете входной параметр (name) переменной-члену (this.name ). Обратите внимание, что довольно часто используется схема именования переменной-члена, чтобы упростить их отличие от локальных переменных, например, добавляя к ним префикс подчеркивания или «m_». Это, однако, варьируется.

Ответ №5:

В вашем методе setName вы устанавливаете переменную на входящую переменную, которая ничего не делает, когда вы используете this . свойство это установит имя на уровне класса вместо входящего параметра

Ответ №6:

Проблему, возможно, будет легче увидеть с небольшой модификацией вашего кода:

 class  Person
{
  public string name;

  public void SetName(string theName)
  {
    theName = theName;
  }
}
  

Назначение theName = theName явно не меняет name , какой элемент данных вы собираетесь установить. Поэтому вы должны использовать:

 this.name = theName;