Resharper建议更改我不知道的.net结构。我很难在结构上找到有关 this()初始值设定项的Microsoft信息。
我在我的struct上有一个构造函数,我传递了值,但是希望struct属性在创建struct之后是只读的。 Resharper提出的方法使代码看起来更清晰。
问题:
示例:
<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垃圾和性能很重要。
答案 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字段初始化为默认值。