我应该用get声明我的抽象类的属性;组;?

时间:2010-02-05 00:26:34

标签: c# c#-3.0 properties field

我正在创建一个小程序,它将抓取我的硬盘并显示在给定驱动器中找到的文件列表。

我的想法是拥有一个基本的File类,并实现从File.cs类继承的Picture.cs,Video.cs和Document.cs类。

这是我的代码:

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

namespace SharpLibrary_MediaManager
{
    public abstract class File
    {
        public string name;
        public string fileType;
        public int size;
        public DateTime creationDate;
        public DateTime modificationDate;        
    }
}

我应该为每个属性声明这样的简写代码:

public string name { get; set; }

任何指导都会有所帮助。谢谢。 :)

修改

我的意思是字面上替换这一行:

public string name;

这一行:

public string name { get; set; }

7 个答案:

答案 0 :(得分:5)

首先,“属性”在这里不是正确的终结。当您声明已定义get和/或set(正式称为“访问者”)的类的成员时,您正在定义属性。属性是公开私有字段值的便捷方式,因为您可以为获取和设置机制添加逻辑。

其次,当您通过

声明成员name
public string name { get; set; } 

编译器会将其扩展为以下内容:

private string _name;
public string name {
    get {
        return _name;
    }
    set {
        _name = value;
    }
}

也就是说,编译器会自动为您创建一个支持字段并定义访问者。这些被称为“自动属性”(对于人们) 1

第三,你永远不应该 2 公开暴露字段。因此,如果要将字符串name公开为公共接口的一部分,最好将其作为属性进行处理。首先,它提供了更好的封装。其次,它可以在dervied类中声明为虚拟和重写。第三,你可以有自定义逻辑。第四,在属性上的读写机制之间可以有不同的可访问级别,但是你不能在一个字段上。

第四,根据接受的命名对象,公共属性应以CamelCase命名,以便您更喜欢Name而不是name

1 :对不起,我一直在等待很长时间才开玩笑。

2 :几乎没有。

答案 1 :(得分:4)

您没有描述单个项目的简写语法,而是2个完全不同类型的成员。 get / set版本创建C#属性,而非get / set版本创建字段。

// field
public string name;  

// property
public string name {get; set;}

所以你在这里要问的是你是否应该将名称作为字段或属性公开。答案几乎肯定是财产。

答案 2 :(得分:1)

如果您希望拥有这些属性(即添加{ get; set; }的内容将生成变量),那么您应该将属性的set;部分声明为protected

所以它变成了:

public string name { get; protected set; }

这样做的好处是,您可以保证该属性只能由基类或任何继承基类的类设置。

正如其他人所建议的那样,遵循C#命名约定是个好主意,强烈建议使用属性。

答案 3 :(得分:1)

为了清楚起见,属性是进行声明性编程的手段。它们用于装饰方法,类等。msdn link

答案 4 :(得分:0)

如果您询问是否公开属性而不是公开字段,则答案为

您还应该使用PascalCase作为属性名称而不是camelCase:

public string Name { get; set; }
public string FileType { get; set; }
// etc

答案 5 :(得分:0)

正如卢克所说,在所有条件相同的情况下,属性都优于字段。

此外,您可能希望更改字段的大小写以匹配标准C#naming conventions

最后,您可能希望避免使用类的“文件”名称,因为您可能正在使用也具有File类的System.IO命名空间。此外,System.IO.FileInfo可能已经包含了您计划创建的许多属性 - 重新发明轮子毫无意义。

答案 6 :(得分:0)

我相信属性优于普通公共字段的另一个优点是能够在派生类中覆盖它们。

class Base
{
public virtual int X
{
get
{
Console.Write("Base GET");
return 10;
}
set
{
Console.Write("Base SET");
}
}
}

class Derived : Base
{
public override int X
{
get
{
Console.Write("Derived GET");
return 10;
}
set
{
Console.Write("Derived SET");
}
}
}

使用属性时适用的另一个有用技巧是能够修改派生属性的修饰符,例如从公共访问更改为受保护。

因此,在很多方面,最好使用基类中的属性来派生。