从对象返回字段值的最佳方法

时间:2017-08-10 13:47:28

标签: c#

在节目中,我正在控制台上写一只狗的品种。

哪种方法最好?为什么?

我认为第一种方式做的操作较少,但要做到这一点,我必须将变量声明为公共。

将声明为私有并从类似我在第二个写作线中的方法返回数据可能是更好的选择吗?

我想了解哪种方法最适合考虑软件的每个重要方面

class Program
{
    static void Main(string[] args)
    {
        Dog fuffy = new Dog("Fuffy", "Armant");
        Console.WriteLine(fuffy.breed);
        Console.WriteLine(fuffy.getBreed());
    }
}


class Dog
{
    public string name;
    public string breed;

    public Dog(string name, string breed)
    {
        this.name = name;
        this.breed = breed;
    }

    public string getBreed()
    {
        return this.breed;
    }
}

编辑:

使用getter和this方法之间是否存在真正的区别?

getter不是一种“隐藏”的方式来编写和执行该方法吗?

与方法相比,吸气剂是否能提供更好的预防?

class Dog
{
    public string name { get; }
    public string breed { get; }

    public Dog(string name, string breed)
    {
        this.name = name;
        this.breed = breed;
    }

    public string getBreed()
    {
        return this.breed;
    }
}

5 个答案:

答案 0 :(得分:4)

" best"方法是使用C#语言功能,即属性

class Dog
{
    public string Name {get;} // read-only property (can be set in constructor)
    public string Breed {get;}

    public Dog(string name, string breed)
    {
        this.Name = name;
        this.Breed = breed;
    }   
}

答案 1 :(得分:2)

在C#中,我们有一个名为properties的语言结构,我认为它们最合适。通常,属性用于公开对象状态,优先于方法,并且可以将它们设置为只读或读写。

class Dog
{
    public string Name { get; private set; }
    public string Breed { get; private set; }

    public Dog(string name, string breed)
    {
        Name = name;
        Breed = breed;
    }
}

C#中的属性有很多种,所以我建议在文档中阅读它们。

答案 2 :(得分:1)

通常,方法表示操作,属性表示数据。 在这种情况下,我会使用Property,因为属性的值存储在进程内存中,属性只提供对值的访问。

使用属性而不是方法

  • 如果属性的值存储在进程内存中并且 property只提供对值的访问。

在以下情况下使用方法而不是属性。

  • 操作比字段集慢几个数量级 是。如果您甚至考虑提供异步版本 一个避免阻塞线程的操作,很有可能 操作太昂贵,不能成为财产。特别是, 访问网络或文件系统的操作(除了 一旦初始化)应该最有可能是方法,而不是 属性。
  • 操作是转换,例如Object.ToString方法。
  • 每次调用操作时,操作都会返回不同的结果 如果参数不改变。例如,NewGuid方法 每次调用时都会返回不同的值。
  • 该操作具有显着且可观察到的副作用。注意 填充内部缓存通常不被认为是 可观察到的副作用。
  • 操作返回内部状态的副本(但不是 包括堆栈上返回的值类型对象的副本。该 operation返回一个数组。

阅读本文以获取有关代码示例的更多信息。

Choosing Between Properties and Methods

答案 3 :(得分:0)

您可以使用属性来封装字段。

    class Program
    {
        static void Main(string[] args)
        {
            Dog fuffy = new Dog("Fuffy", "Amarant");
            Console.WriteLine(fuffy.Name);
            Console.WriteLine(fuffy.Breed);
    }
}

class Dog
{
    private string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
    private string breed;
    public string Breed
    {
        get { return breed; }
        set { breed = value; }
    }
    public Dog(string pName, string pBreed)
    {
        Breed = pBreed;
        Name = pName;
    }
}

答案 4 :(得分:0)

我会说他们都不是最好的#34;但我会使用C#内置的properties

public string Breed {get;set;}

如果您想阻止设置品种,可以删除set

public string Breed {get;}

在您的示例中,getBreed是只读的,相当于我的第二个示例。

将您的课程修改为如下所示:

class Program
{
    static void Main(string[] args)
    {
        Dog fuffy = new Dog("Fuffy", "Armant");
        Console.WriteLine(fuffy.breed); //Prints Fuffy
        Console.WriteLine(fuffy.breed = "Muffy"); //Prints Muffy
        Console.WriteLine(fuffy.breed_readonly = "Muffy"); //World ends in exception
    }
}


class Dog
{
    public string name {get;set;}
    public string breed {get;set;}

    public string name_readonly {get;}
    public string breed_readonly {get;}

    public Dog(string name, string breed)
    {
        this.name = name;
        this.breed = breed;

        this.name_readonly = name;
        this.breed_readonly = breed;
    }
}