C#,使用++运算符对通过属性获取的值(get)

jen*_*nsa 3 c# properties

在C#中,我们定义一个属性如下:

// m_age is a private int in the class Employee
public int Age
{
    get {return m_age;}
    set {m_age = value;}
}
Run Code Online (Sandbox Code Playgroud)

现在,当我这样做

static void Main()
{
    Employee e = new Employee(age: 28); // Create new Employee
    System.Console.WriteLine("Age: {0}", e.Age); // Prints 28

    // Now increase age by 1
    ++e.Age;

    System.Console.WriteLine("Age: {0}", e.Age); // Prints 29
}
Run Code Online (Sandbox Code Playgroud)

为什么呢

++e.Age;
Run Code Online (Sandbox Code Playgroud)

工作?我做了一些搜索并找到了属性 - 按价值或参考?

这篇文章有一个答案:

从技术上讲,它总是靠价值,但你必须了解传递的是什么.因为它是一个引用类型,所以你传回一个引用(但是按值).

希望有道理.您总是按值传递结果,但如果类型是引用,则您将按值传递引用,这意味着您可以更改对象,但不能更改它引用的对象.

(我对值类型和引用类型有很好的理解,因此我的困惑).

现在,如果确实如此

e.Age
Run Code Online (Sandbox Code Playgroud)

返回m_age 的副本(int是值类型),我们不会将增量++应用于副本吗?

或者......以下是真的吗?

++e.Age;
Run Code Online (Sandbox Code Playgroud)

完全相同/被翻译成

e.Age = e.Age + 1
Run Code Online (Sandbox Code Playgroud)

只有这样

++e.Age;
Run Code Online (Sandbox Code Playgroud)

返回一个值(e.Age增加后的值),而

e.Age = e.Age + 1
Run Code Online (Sandbox Code Playgroud)

是一个赋值,不返回一个值(例如C++会这样做).

Phi*_*aré 7

++运营商,除非重新定义,将get修改并set再次值.

检查这个的一个好方法是定义get和set并在调试模式下完成.增量和减量运算符的C#规范中详细说明了这种行为.

  • 以下是规范中描述此行为的部分:https://msdn.microsoft.com/en-us/library/aa691369(v = vs.71).aspx (2认同)