Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 传入参数的名称与字段名称相同_C# - Fatal编程技术网

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

C# 传入参数的名称与字段名称相同,c#,C#,这个人的名字是空的。这可以使用This.name=name 人名为空(空字符串)的原因是什么 class Person { public string name; public void SetName(string name) { name = name; } } public void static Main(string[] args) { Person aPerson = new Person(); aPerson.SetName("

这个人的名字是空的。这可以使用
This.name=name


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

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);
}
只是将参数的值赋回自身。换句话说,这是禁止的

如果将其更改为:

name = name;
然后将参数的值指定给您想要的字段

但是,当前人员的
姓名
字段不会引用空字符串-它将是空引用。这两者之间有很大的区别

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

在方法中

this.name = name;
您不设置公共字段,而是设置参数。要设置公共字段,应使用

public void SetName(string name) 
{ 
    name = name; 
}
更好的方法是使用属性:

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

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

更好的方法可能是

private string name;
public string Name
{
    get { return this.name; }
    set { this.name = value; }
}
有些人喜欢在私有成员字段中使用下划线

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

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

您正在将输入参数(名称)分配给自身。通过使用this.name=name,可以将输入参数(name)显式分配给成员变量(this.name)。请注意,使用成员变量的命名方案可以更容易地将它们与局部变量区分开来,这是非常常见的,例如,在它们前面加下划线或“m_3;”。但是,这会有所不同。

在SetName方法中,当您使用This时,您将变量设置为传入变量,而传入变量不起任何作用。属性,它将在类级别而不是传入参数中设置名称。只需稍微修改代码,问题可能更容易发现:

private string _name;
分配
theName=theName
显然不会更改要设置的数据成员
name
。因此,您必须使用:

class  Person
{
  public string name;

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

@乔恩:将参数赋值回自身,你能告诉它是如何发生的,以及这将如何创建一个空值吗reference@Raghav55:您只是在分配一个值,仅此而已。假设它是一个
int
变量:你说的是“让变量的值……变量的值”。所以它没有任何用处。@Jon:但是为什么空引用是set@Raghav55:字段的默认值为空引用。由于原始代码没有为该字段分配任何其他值,因此您得到了一个空引用。@jon:很抱歉,有许多问题是public void SetName(string name){name=name},因此编译器将传入的参数视为局部变量,但为什么没有给出编译错误这不是一个真正的问题?这是一个新手问题,但这是一个真正的新手问题。
this.name = theName;