传入参数的名称与字段名称相同

时间:2011-04-28 10:47:22

标签: 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;

可以消除这种情况

人名是空的(空字符串)是什么原因?

6 个答案:

答案 0 :(得分:6)

目前,您的

分配
name = name;

只是将参数的值分配回自身。换句话说,这是一个无操作。

如果您将其更改为:

this.name = name;

然后将参数的值分配给字段,这是你想要的。

但是,目前Person的name字段不会引用空字符串 - 它将是一个空引用。这两者之间存在很大差异。

(当然,通常你不应该有一个公共字段,你应该使用属性而不是SetName方法。)

答案 1 :(得分:0)

方法

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

答案 2 :(得分:0)

不使用this关键字,您只需将name参数的值重新分配给参数本身。 this关键字为您提供了可以使用的实例。

更好的方法可能是

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

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

有些人喜欢在私人会员字段中使用下划线

private string _name;

答案 3 :(得分:0)

您正在为自己分配输入参数(名称)。通过使用this.name = name,您将显式地将输入参数(name)分配给成员变量(this.name)。注意,对成员变量使用命名方案以使其更容易从局部变量中删除它们是很常见的,例如,在它们前面加上下划线或“m_”。然而,这种情况各不相同。

答案 4 :(得分:0)

在SetName方法中,当您使用此变量时,您将变量设置为传入变量,该变量不执行任何操作。属性它将在类级别而不是传入参数

中设置名称

答案 5 :(得分:0)

稍微修改一下代码可能会更容易看到问题:

class  Person
{
  public string name;

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

明确指定theName = theName不会更改name,这是您要设置的数据成员。所以你必须使用:

this.name = theName;