#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;