2012-01-14 66 views
1

我知道这有点假设,因为我没有循环这个,它只在程序运行中出现一次或两次,所以它只会是一个完全不可思议的时间量,但我想知道是否有一个这些比其他更好,或者根本不重要,因为优化器会优化掉更糟糕的代码。以上哪两项效率更高?

我有这个类:

class FOO_Data 
{ 
    private string description, url; 
    private bool editable; 

    public FOO_Data(string description, string url, bool editable) 
    { 
     this.description = description; 
     this.url = url; 
     this.editable = editable; 
    } 

    public string Description { get { return description; } set { description = value; } } 
    public string URL { get { return url; } set { url = value; } } 
    public bool Editable { get { return editable; } set { editable = value; } } 
} 

在我的代码中一些其他的问题,我需要在这个类的一个数组编辑这个类的一个实例。

哪一个更好?这一个:

array[index] = new FOO_Data(data.Description, data.URL, System.Convert.ToBoolean(data.Editable)); 

或者这一个:

array[index].Description = data.Description; 
array[index].Editable = Convert.ToBoolean(data.Editable); 
array[index].URL = data.URL; 

我会倾向于第一,但我不是很肯定。我希望你能提供任何见解。

非常感谢!

+0

非常感谢您的洞察力。非常感谢:) – niemiro 2012-01-14 14:24:36

+2

在一个循环中运行两个场景,使用千万次迭代并用秒表计时。我会假设唯一的区别是第二个不必为堆栈值在堆栈上分配新的空间。在第一个中,旧值被销毁并重新创建,这意味着GC需要清理。(字符串将被销毁并重新创建,无论如何) – 2012-01-14 14:25:56

回答

3

如果array[index]null,试图访问成员的第二位代码将抛出NullReferenceException

这不可能发生在代码的第一位,在那里你指定一个新构建的对象FOO_Data

就性能而言,如果由于对象创建是一个非常轻的过程,您确实不会看到任何差异。

+0

非常感谢您的回复。我没有想过那个空案。有趣...你的回应非常感谢。我打算接受这10分钟后的答案再次感谢:) – niemiro 2012-01-14 14:26:49

2

我会选择第二种方法,稍作修改。

var foo = array[index]; 
if(foo == null) 
{ 
    foo = new Foo_Data(); 
    array[index] = foo; 
} 
foo.Description = data.Description; 
foo.Editable = ... 
... 
3

首先,如果你.Net的3个工作或更新,你可以使用自动实现的属性:除了

public string Description { get; set;} 

与支持字段属性。

关于哪一个更好,我认为这是语法糖,但我更喜欢第一种方法,因为封装初始化,也在第二种方法中存在空例外的可能性。实际上你不应该考虑位优化。