首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何正确定义类属性?

如何正确定义类属性?
EN

Stack Overflow用户
提问于 2010-07-10 02:52:15
回答 4查看 15.2K关注 0票数 12

在项目中定义新类时,正确/最佳的做法是什么?在过去,我已经创建了这样的类:

代码语言:javascript
运行
复制
  public class MyClass
  {
      public string FirstName  {get; set;}
      public string LastName  {get; set;}
  }

通常,我会使用这样的类在项目中创建集合。

但是,随着我不断学习和阅读更多关于c# sharp的内容,我看到了一些示例,其中类的定义如下:

代码语言:javascript
运行
复制
    class MyClass //not set to public
    {
        private string  _firstName; //first defined as fields
        private string _lastName;

        public string FirstName  // then defined as properties 
        {
            get { return  _firstName; }
            set { _firstName = value; }
        }
        public string LastName
        {
            get { return _lastName; }
            set { _lastName = value; }
        }
    }

第一种方法在定义上是不正确的,还是这是C#中被接受的速记版本?作为最佳实践,您是否应该总是首先定义具有私有字段的类,然后使用get / set to a value将它们定义为属性?

我之所以这样问,是因为我在C#上自学,我正在努力改进和更好地理解正确的开发方法,一些示例和教程只是简单地陈述了方法,而没有可靠的解释为什么其中一种方法比另一种方法更好(或应该做)。

提前感谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-07-10 02:55:19

您的第一个示例:

代码语言:javascript
运行
复制
public class MyClass
{
    public string FirstName  {get;  set;}
    public string LastName  {get;  set;}
}

特别是在c# 3.0中引入的Auto-Implemented Properties。两种格式都没有错。第一种更像是一种“速记”。

对于更复杂的类型,有时使用旧样式仍然很有用,并且只公开私有变量中的某些属性或值,例如:

代码语言:javascript
运行
复制
public class MyClass
{
    private Dictionary<int, List<string>> _someInternalDictionary;

    public int MyValuesCount
    {
        get
        {
            return _someInternalDictionary.Values.Count;
        }
    }

}

这是一个粗略的例子,但希望您能理解我的想法。

票数 16
EN

Stack Overflow用户

发布于 2010-07-10 02:54:55

第一个示例中的简写语法(自动实现的属性)是在C# 3.0中引入的,在此之前是无效的。编译器实际上会将它们转换为带有后备字段的完整形式。

在C# 3.0之前,定义属性的唯一正确方法是使用支持字段。

即使在C# 3.0中,如果您想在属性中包含任何逻辑,也需要将它们转换为使用支持字段。

简而言之-对于哑属性(那些什么也不做的属性),使用auto属性。它们使您的代码更简单、更容易阅读,并且可以进行转换。

票数 14
EN

Stack Overflow用户

发布于 2010-07-10 02:57:09

实际上,您拥有的两个类在功能和特性上是相同的。

自动属性语法(第一个类)的目的基本上是为您提供一种快速的方法来声明本质上与您所显示的第二个类相同的内容。

我会一直使用第一个版本,直到您需要向getter或setter方法添加代码(比如验证属性的新值)。

自动属性语法的目的是双重的,添加它的一部分是为了方便Linq,另一部分是为了更容易确保声明属性,而不是公共字段。

如果您使用自动属性(同样是第一个版本)声明一个类,那么根据您的代码编译的所有其他程序集都将知道您的类将这些内容声明为属性,而不是字段。如果您稍后决定需要添加代码(如验证),则不必重新编译这些其他程序集,因为它们仍然可以找到属性。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3215649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档