请注意此问题仅与性能有关.让我们跳过设计指南,理念,兼容性,可移植性以及与纯性能无关的任何内容.谢谢.
现在回答这个问题.我一直认为,因为C#getters/setter实际上是伪装的方法,所以读取公共字段必须比调用getter更快.
所以要确保我做了一个测试(下面的代码).但是,如果从Visual Studio内部运行,此测试仅产生预期结果(即字段比34%的getter快).
一旦从命令行运行它,它显示几乎相同的时间......
唯一的解释可能是CLR做了额外的优化(如果我错了,请纠正我).
我不相信在实际应用中,以更复杂的方式使用这些属性,它们将以相同的方式进行优化.
请帮助我证明或反驳现实生活中的属性比田地慢的想法.
问题是 - 我应该如何修改测试类以使CLR改变行为,以便公共字段超越getter.或者告诉我,任何没有内部逻辑的属性都会像字段一样执行(至少在getter上)
编辑:我只谈论发布x64版本.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Diagnostics;
using System.Runtime.InteropServices;
namespace PropertyVsField
{
class Program
{
static int LEN = 20000000;
static void Main(string[] args)
{
List<A> a = new List<A>(LEN);
List<B> b = new List<B>(LEN);
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < LEN; i++)
{
double p = r.NextDouble();
a.Add(new A() { P = p }); …Run Code Online (Sandbox Code Playgroud) 我正在学习C#,并且正在学习如何将字段设为私有类,并使用Getters和Setters来公开方法而不是字段值.
是get; set;在方法1和方法2相同呢?例如,一个是另一个的速记吗?
class Student
{
// Instance fields
private string name;
private int mark;
// Method 1
public string Name { get; set; }
// Method 2
public int Mark
{
get { return mark; }
set { mark = value; }
}
}
Run Code Online (Sandbox Code Playgroud)
最后,如果您想在获取或设置值之前执行计算,是否可以使用方法2?例如,将值转换为百分比或执行验证?例如
class Student
{
// Instance fields
private string name;
private double mark;
private int maxMark = 50;
// Method 1
public string Name { get; set; …Run Code Online (Sandbox Code Playgroud) 由于这些属性只是方法之下,可以理解的是,它们可能执行的任何逻辑的性能可能会或可能不会提高性能 - 因此JIT需要检查方法是否值得内联是可以理解的.
然而,自动属性(据我所知)不能有任何逻辑,只需返回或设置基础字段的值.据我所知,自动属性由编译器和JIT处理,就像任何其他方法一样.
(以下所有内容都依赖于上述段落正确的假设.)
值类型属性显示与变量本身不同的行为,但是参考类型属性应该具有与直接访问基础变量完全相同的行为.
// Automatic Properties Example
public Object MyObj { get; private set; }
Run Code Online (Sandbox Code Playgroud)
是否存在自动属性Reference Types可以通过内联显示性能受损的情况?
如果没有,是什么阻止编译器或JIT自动内联它们?
注意:我理解性能增益可能是微不足道的,特别是当JIT可能无论如何使用它时都可能内联它们 - 但是增益可能很小,似乎合乎逻辑的是,无论如何都会引入这种看似简单的优化.
c# ×3
.net ×1
c#-4.0 ×1
get ×1
inline ×1
jit ×1
optimization ×1
performance ×1
set ×1
shorthand ×1