Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 方法还是属性?_C#_Methods_Properties - Fatal编程技术网

C# 方法还是属性?

C# 方法还是属性?,c#,methods,properties,C#,Methods,Properties,我有一个类,我将其称为SpiderNest,它的属性类型为List,其中Spider是一种对象类型,其属性类型为int;我们将此属性称为NumberOfLegs。我想要SpiderNest类上的一个方法或属性来获取我的巢穴中所有蜘蛛的腿数之和 是否最好使用这样的属性(请原谅对象命名不当): 类蜘蛛巢{ //我们的示例属性。 公共列表爬虫{get;set;} 公共整数 { 获取{返回spider.Sum(spider=>spider.NumberOfLegs);} } 还是一种方法 class

我有一个类,我将其称为
SpiderNest
,它的属性类型为
List
,其中
Spider
是一种对象类型,其属性类型为
int
;我们将此属性称为
NumberOfLegs
。我想要
SpiderNest
类上的一个方法或属性来获取我的巢穴中所有蜘蛛的腿数之和

是否最好使用这样的属性(请原谅对象命名不当):

类蜘蛛巢{
//我们的示例属性。
公共列表爬虫{get;set;}
公共整数
{ 
获取{返回spider.Sum(spider=>spider.NumberOfLegs);}
}
还是一种方法

class SpiderNest {
    public List<Spider> Spiders { get; set; }

    public int GetTotalNumberOfLegs() 
    {
        return Spiders.Sum(spider => spider.NumberOfLegs);
    }
}
类蜘蛛巢{
公共列表爬虫{get;set;}
public int getTotalNumber of legs()
{
返回spider.Sum(spider=>spider.NumberOfLegs);
}
}

你为什么会选择这种方式呢?我知道这个问题可能很棘手,但每当我遇到两种方法做某事时,每种方法通常都是有益的。谢谢!这种方法没有副作用,但是如果
爬行器
很大,计算可能会很昂贵。如果
爬行器
很大它应该是一个方法,否则就成为一个属性。

看看MSDN

属性应该像字段一样使用,这意味着属性不应该计算复杂或产生副作用

一定要使用方法,而不是属性[如果]…操作比字段集慢几个数量级[或]…该操作有显著且可观察的副作用

让我们考虑一个例子——如果你的代码>清单>代码>从一个懒惰加载的数据库中填充,所以当你对你的列表进行一个调用时,它会从数据库中被填充——这意味着当你要求总的腿数时,你可以等待信息被填充——这不是一个即时操作。使用一种方法会更好


此外,我总是觉得说
GetXXX()
意味着该方法可以在不同的执行点返回不同的值,而属性则更像是一个静态数字
如果您计划在启动后将爬行器添加到您的巢穴中。

另一个提示是,它是否会产生副作用(如更改另一个属性或某些内部状态)。如果是,将其作为一种方法,即使它很便宜


在您的特定情况下,我会将其作为属性。如果计算可能需要很长时间(由于列表包含
int.MaxValue
items)我会在属性本身中创建一个缓存,当第一次调用该值时,或者当列表自上次计算以来发生更改时,该缓存将计算该值一次。或者,每次列表更改时,都会预先计算总和,并且在您的属性中,您只需返回最新的计算值。但所有这些可能性取决于列表元素的设计(例如,它们是不可变的还是实现INotifyPropertyChanged?)列表更改的频率与客户需要的总和的频率相比。

对Justin的回答做一点澄清:当你将某个东西实现为属性时,你是在向你的类消费者暗示这是一个相对便宜且简单的操作。这不是一成不变的,而是当看到
NumberOfLegs属性或
GetNumberOfLegs()
方法,我对后者的直觉告诉我,这是一个昂贵的操作,其结果应该被缓存,而前者应该是可重复的。请注意这些期望。这似乎是一个非常好的经验法则。谢谢!
class SpiderNest {
    public List<Spider> Spiders { get; set; }

    public int GetTotalNumberOfLegs() 
    {
        return Spiders.Sum(spider => spider.NumberOfLegs);
    }
}