如何在 C # 中执行 struct 内联初始化?

我应该在我的任意结构中执行哪个成员,以使下列任务成为可能:

public struct MyStruct {
String s;
Int length;
}


MyStruct myStruct = new MyStruct { s = "Hello", length = 5 };


// Now, I want the following code to set the 's' to "Lol" and the
// length to 3 (length of "Lol"). The second part should be done
// automatically.
myStruct = "Lol"; // Or myStruct = String("Lol");

这应该怎么做呢?

162632 次浏览

您的结构可以具有方法和属性... ... 为什么不尝试一下呢

public struct MyStruct {
public string s;
public int length { return s.Length; }
}

更正 @Guffa 的回答表明这是可能的... 更多信息在这里: < a href = “ http://www.codeproject.com/kB/cs/CSharp _ impic _ operator.aspx”rel = “ nofollow noReferrer”> http://www.codeproject.com/kb/cs/csharp_implicit_operator.aspx

使用隐式运算符将字符串值转换为结构值:

public struct MyStruct {
public string s;
public int length;


public static implicit operator MyStruct(string value) {
return new MyStruct() { s = value, length = value.Length };
}


}

例如:

MyStruct myStruct = "Lol";
Console.WriteLine(myStruct.s);
Console.WriteLine(myStruct.length);

产出:

Lol
3
  1. “长度”会不会偏离“ s”的实际长度。如果答案是否定的,那么您就不需要存储长度,因为字符串已经存储了它们的长度,您可以直接调用 s.Llength。

  2. 要获得您要求的语法,您可以实现一个“隐式”运算符,如下所示:

    static implicit operator MyStruct(string s) {
    return new MyStruct(...);
    }
    
  3. The implicit operator will work, regardless of whether you make your struct mutable or not.

只要可行,结构类型应该将它们的所有状态封装在公共字段中,这些公共字段可以独立地设置为对它们各自的类型有效的任何值,或者表现为一个单一的统一值,只能通过构造函数、工厂、方法进行设置,或者将一个结构的实例作为一个显式的 ref参数传递给它的一个公共方法。与一些人声称的相反,一个结构拥有公共字段并没有什么问题,如果它应该表示一组值,这些值可以被合理地单独操作或作为一个组传递(例如一个点的坐标)。从历史上看,使用公共属性设置器的结构存在一些问题,为了避免使用公共字段(意味着应该使用设置器) ,一些人建议完全避免使用可变结构,但字段没有属性所存在的问题。事实上,对于松散的独立变量集合来说,公开字段结构是理想的表示形式,因为它 只是松散的变量集合。

但是,在您的特定示例中,结构的两个字段似乎不应该是独立的。有三种方法可以合理地设计结构:

  • 您可以将字符串作为唯一的公共字段,然后使用名为 length的只读“ helper”属性,如果字符串为非空,该属性将报告其长度; 如果字符串为空,则返回零。

  • 您可以让 struct 不公开任何公共字段、属性设置器或可变方法,并在对象的构造函数中指定唯一字段(私有字符串)的内容。如上所述,length将是一个报告所存储字符串长度的属性。

  • 您可以让 struct 不公开任何公共字段、属性设置器或变异方法,并且有两个私有字段: 一个用于字符串,一个用于长度,这两个字段都将在一个构造函数中设置,该构造函数接受字符串,存储字符串,测量字符串的长度,并存储字符串。确定一个字符串的长度非常快,因此可能不值得计算和缓存它,但是有一个将字符串和它的 GetHashCode值组合在一起的结构可能是有用的。

然而,注意第三种设计的细节是很重要的: 如果非线程安全的代码导致结构的一个实例被读取,而另一个线程正在写入它,这可能会导致意外创建字段值不一致的结构实例。由此产生的行为可能与以非线程安全的方式使用类时产生的行为略有不同。任何与安全性有关的代码都必须小心,不要假定结构字段将处于一致状态,因为恶意代码——即使在“完全信任”环境中——如果它希望这样做,也可以很容易地生成状态不一致的结构。

PS ——如果您希望使用字符串的赋值来初始化结构,我建议使用隐式转换运算符,并使 Length成为一个只读属性,如果字符串为非 null,返回底层字符串的长度; 如果字符串为 null,返回零。