0

我在这里有一个程序片段,它允许创建一个具有年龄、id、姓名和工资等简单属性的 Employee 对象。只是在玩它,我注意到

 Console.WriteLine(joe.Age+1); is my Main() method returns one, 

Console.WriteLine(joe.Age++);返回 0。我知道根据构造函数将 Age 属性初始化为 0,但为什么不使用 ++ 运算符添加 1? 编辑:我找到了奇怪行为的根源。在我拥有的 Age 属性中empAge=Age,它应该等于value

来源:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace EmployeeApp
{
    class Employee
    {
        //field data
        //notice the the fields are declared as private
        //these fields are used in the constructors
        private string empName;
        private int empID;
        private float currPay;
        private int empAge;

        //properties! private field data should be accessed via public properties
        //note that properties don't use parentheses ()
        //within the set scope you see the 'value' contextual keyword
        //it represents the value being assigned by the caller and it will always be the same 
        //underlying data type as the property itself
        public int Age
        {
            get { return empAge; }
            set { empAge = Age; }
        }


        public string Name
        {
            get { return empName; }
            set
            {
                if (value.Length > 15)
                    Console.WriteLine("this name is too long.");
                else
                    empName = value;
            }
        }
        public int ID
        {
            get { return empID; }
            set { empID = value; }
        }
        public float pay
        {
            get { return currPay; }
            set { currPay = value; }
        }

        //constructors
        public Employee() { }

        public Employee(string name, int id, float pay, int age)
        {
            empName = name;
            empID = id;
            currPay = pay;
            empAge = age;
        }

        //methods
        //the int parameter that this method takes will come from somewhere in the Main method
        //currpay is a private field
        public void GiveBonus(float amount)
        {
            currPay += amount;
        }
        public void DisplayStats()
        {
            Console.WriteLine("name: {0}", empName);
            Console.WriteLine("ID: {0}", empID);
            Console.WriteLine("pay: {0}", currPay);
            Console.WriteLine("age: {0}", empAge);
        }
    }

}

主要方法在这里

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//Encapsulation using traditional accessors/mutators or get/set methods
//the role of a get method is to return to the caller the current value of the underlying state data
//a set method allows the caller ot change the current value of the state data

//you need to have a getter and a setter for every field that the class has

namespace EmployeeApp
{
    class Program
    {
        static void Main(string[] args)
        {
            //Console.WriteLine("fun with encapsulation");
            //Employee emp = new Employee("marvin", 456, 4000, 56);
            //emp.GiveBonus(3);
           // emp.DisplayStats();
           // emp.Name = "wilson";
           // emp.DisplayStats();

            Employee joe = new Employee();

            Console.WriteLine(joe.Age++);
        }
    }
}
4

4 回答 4

4

增量运算符有++两种用途:

joe.Age++

++joe.Age

正如您使用的那样,第一个在当前操作之后执行。因此,当您调用 时Console.WriteLine(joe.Age++);,这也可以表示为:

Console.WriteLine(joe.Age);
joe.Age = joe.Age + 1;

因此,您将当前值传递给WriteLine然后将其递增。

领先++将做相反的事情 - 增加然后使用该值。所以,Console.WriteLine(++joe.Age);也可以读作:

joe.Age = joe.Age + 1;
Console.WriteLine(joe.Age);
于 2012-10-05T13:04:21.717 回答
3

当您在变量后使用一元 ++ 运算符时,在计算外部表达式之前不会发生加法。当您在变量之前使用它时,加法发生在评估外部表达式之前。

例如,

// this will increment joe.Age, and then write it to console.
Console.WriteLine(++joe.Age);

相对

// this will write joe.Age to the console, and then increment it.
Console.WriteLine(joe.Age++);

msdn 上的文档

第一种形式是前缀递增操作。操作的结果是操作数增加后的值。

第二种形式是后缀递增操作。操作的结果是操作数在递增之前的值。

于 2012-10-05T13:04:11.493 回答
1

在 C++ 和 C# 中,有两个 ++ 运算符。第一个是前缀运算符 (++age),它按您的预期工作 - 递增值,然后返回结果。后缀运算符 (age++) 增加值但返回前一个值。

于 2012-10-05T13:04:39.210 回答
1

在您的 Age 属性中,您没有将empAge成员更改为传入的值。这可能是您在++多次尝试时没有看到任何更改的原因。

public int Age 
{ 
    get { return empAge; } 
    set { empAge = Age;  } // this does not set the value!
} 

改用value

public int Age 
{ 
    get { return empAge;   } 
    set { empAge = value;  } // use the value passed in
} 

正如其他人所指出的,您正在使用++运算符的后缀版本。在将属性写入控制台之前,前缀版本将首先增加数量。

于 2012-10-05T13:06:54.237 回答