C#Struct this()初始化程序 - 内存,性能和清洁度

时间:2016-09-13 17:37:53

标签: c# .net performance struct garbage-collection

Resharper建议更改我不知道的.net结构。我很难在结构上找到有关 this()初始值设定项的Microsoft信息。

我在我的struct上有一个构造函数,我传递了值,但是希望struct属性在创建struct之后是只读的。 Resharper提出的方法使代码看起来更清晰。

问题:

  • 内存:如果可能,我想避免产生任何额外的垃圾。我担心使用this()可能会在设置之前预先初始化我的值类型。
  • 性能:我担心使用this()将首先使用默认值初始化struct值,然后设置值。不必要的操作。避免这种情况会很好。
  • 清洁度:很明显,使用:this()可以使结构更清晰。我们为什么不想使用它?

示例:

<h2>FORM</h2>
<form action="form.php" method="post" name="myForm" onsubmit="return validateForm()">
  <input type="text" name="name" value="">
  <br>
  <br>
  <input type="radio" name="gender" value="M" Male>
  <br>
  <input type="radio" name="gender" value="F" Female>
  <br>
  <br>

  <input type="submit" value="Submit" name="submit">
</form>
<script>
  function validateForm() {
    var x = document.forms["myForm"]["name"].value;
    if (x == null || x == "") {
      alert("Name must be filled out");
      return false;
    }
  }
</script>

如果您正在尝试优化性能并减少.net垃圾,那么这是正确的路线吗?编译时是否有差异?

当我为数据处理创建数百万个结构时,我不想盲目地接受使用它。它们是短暂的容器对象,因此.net垃圾和性能很重要。

2 个答案:

答案 0 :(得分:1)

这是关于自动实现的属性和结构的语言的缩写。它已在C#6中修复,其中不需要显式调用this,您甚至可以取消私有的setter:

public struct MyContainer
{
    public int MyValue { get; }
    public MyContainer(int value)
    {
         MyValue = value; //readonly properties can be set in the constructor, similar to how readonly fields behave
    }
}

至于表现。如果两者之间存在显着差异(我目前无法检查生成的IL中的差异),我会非常惊讶。 (根据评论,答案的下一部分是无关紧要的,调用this()不会产生额外的“垃圾”)另外,如果对象像你声称的那样短暂存在,我就不会完全担心垃圾,因为它们都会存储在堆栈中,而不是堆内存中。

答案 1 :(得分:1)

我使用“this()”初始化程序创建了一个结构的快速基准,而没有像这样:

    struct Data
    {
        public Data(long big, long big2, int small)
        {
            big_data = big;
            big_data2 = big2;
            small_data = small;
        }

        public long big_data;
        public long big_data2;
        public int small_data;
    }

我通过初始化每种类型的50亿个结构来进行基准测试。我发现在调试模式下,没有“this()”初始化程序的结构测试速度明显加快。在发布模式下,它们几乎相同。我假设在发布模式下,“this()”正在优化,在调试中它正在运行“this()”,甚至可能将struct字段初始化为默认值。