c# - 在此示例中使用 get 和 set 属性有什么好处?

标签 c# visual-studio-2012 properties

<分区>

在以下示例中使用 get 和 set 属性有什么好处?:

class Program
{
    public class MyClass
    {
        private int age;

        public int persons_age
        {
            get
            {
                return age;
            }

            set
            {
                age = value;
            }
        }

    }

    static void Main(string[] args)
    {

       MyClass homer = new MyClass();

       homer.persons_age = 45; //uses the set property

       homer.persons_age = 56; //overwrites the value set by the line above to 56

       int homersage=homer.persons_age; //uses the get property

       Console.WriteLine(homersage);

    }
}

这样做和下面的有什么区别?:

public class MyClass
    {
        public int age;
    }

 static void Main(string[] args)

    {

       MyClass homer = new MyClass();

       homer.age = 45;

       homer.age = 56; //overwrites the value set by the line above to 56

       int homersage=homer.age;

       Console.WriteLine(homersage);

    }

当上述两个程序的作用完全没有区别时,使用 get 和 set 属性有什么好处?与客户端通过某些逻辑检查通过 set 方法将值分配给字段的能力有限的情况不同,在这种情况下,我看不到此处显示的两个程序之间有任何功能差异。

此外,如果此类属性未用于类字段,一些编程书籍会使用短语“...破坏客户端代码”。有人可以解释一下吗?

谢谢。

最佳答案

我能想到的一个答案是,通过setter 和getter 方法,您可以在其中添加检查或验证。与通过公开声明直接访问它不同,检查/验证将落在不同的位置并且可能重复代码。 示例:

    public class MyClass
    {
        private int age;

        public int persons_age
        {
            get
            {
                return age;
            }

            set
            {
                if(value > 0)
                    age = value;
                else
                    //do something here
            }
        }

    } 

通过这种方式,您可以定义对对象的约束。

关于c# - 在此示例中使用 get 和 set 属性有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22547960/

相关文章:

spring - 如何在不由 spring 管理的 pojo 中从 Spring Context 获取属性?

java - 如何将 Hudson 的 env.EXECUTOR_NUMBER 传递给 log4j 属性和 Java 的 System.getProperty

c# - 同一台机器上的两个程序相互通信的最佳方式是什么

c# - Linq to Sql DB 对象到领域对象的映射和性能

c# - 正则表达式按空格将字符串拆分为单词并包含字符

visual-studio - Visual Studio 项目中的 If 语句

c++ - 如何在我的源代码中找到所有出现的地方,其中 std::string 作为拷贝而不是常量引用传递给方法?

c# - 我真的不应该在属性访问器中做 "long running"事情吗?

c# - C# 中的 "yield"和 "yield return"有什么区别(如果有的话)?

windows-8 - 在 Visual Studio Simulator for Windows 8 应用程序中更改默认分辨率列表