C# 为大字符串标识自己的字符串对象?
也许这听起来很奇怪,但是我们的想法是定义一个类,比如LargeString,它的行为就像一个字符串,只是它不应该通过调用“+=”操作符来创建一个新的引用 因此,我可以将这个最大的字符串用于连接,而不是StringBuilder类 这应该是这样的:C# 为大字符串标识自己的字符串对象?,c#,string,C#,String,也许这听起来很奇怪,但是我们的想法是定义一个类,比如LargeString,它的行为就像一个字符串,只是它不应该通过调用“+=”操作符来创建一个新的引用 因此,我可以将这个最大的字符串用于连接,而不是StringBuilder类 这应该是这样的: LargeString s1 = "someLongString1"; LargeString s2 = "someLongString2"; LargeString s3 = s1 + s2; s3 += "someLongString3" 那么最
LargeString s1 = "someLongString1";
LargeString s2 = "someLongString2";
LargeString s3 = s1 + s2;
s3 += "someLongString3"
那么最后一行不应该创建新的引用。
这在重载运算符或其他技巧中是否可能
注意:我知道通过创建一个带有本地
Stringbuilder成员,但我真的很想找到一个更漂亮的
方法。要解决最大s1=test1问题,您可以使用并使其编译:
void Foo(string s)
{
}
LargeString largeString = "test";
Foo(largeString);
要解决最大的s1=test1问题,您可以使用并使其编译:
void Foo(string s)
{
}
LargeString largeString = "test";
Foo(largeString);
C不允许重载=运算符或+=运算符。+=运算符将使用任何适当的+运算符,但将始终执行+后跟= 唯一的选项是重写+运算符以返回左侧实例,例如:
//Allows no copy +=
public static operator +(LongString left, LongString right)
{
left.Add(right);
return left;
}
//Allows assignment of string to LongString
public static implicit operator LongString(string original)
{
return new LongString(original);
}
但我强烈反对这样做,因为它根本不是标准的,而且会让任何使用它的人感到困惑
关于实际实现,除非StringBuilder在您的设计中存在重大缺陷,否则您可能希望将其包装为基本情况。C不允许重载=运算符或+=运算符。+=运算符将使用任何适当的+运算符,但将始终执行+后跟= 唯一的选项是重写+运算符以返回左侧实例,例如:
//Allows no copy +=
public static operator +(LongString left, LongString right)
{
left.Add(right);
return left;
}
//Allows assignment of string to LongString
public static implicit operator LongString(string original)
{
return new LongString(original);
}
但我强烈反对这样做,因为它根本不是标准的,而且会让任何使用它的人感到困惑
至于实际实现,除非StringBuilder在您的设计中有一个主要缺陷,否则您可能会希望将其包装为基本情况。AFAIK,这是完全不可能的。如果你想知道,语法注释1是不正确的。您可以提供从字符串到最大字符串的隐式转换。所有这些都是为了避免stringBuilder.Append?这个类做什么而stringBuilder不做什么?我不确定我是否理解你所说的比包装StringBuilder更美观的意思——StringBuilder上的立面似乎是显而易见的解决方案。否则,您将面临重新实现StringBuilder的行为,不是吗?这没有什么美感……好吧,那完全不可能。如果你想知道,语法注释1是不正确的。您可以提供从字符串到最大字符串的隐式转换。所有这些都是为了避免stringBuilder.Append?这个类做什么而stringBuilder不做什么?我不确定我是否理解你所说的比包装StringBuilder更美观的意思——StringBuilder上的立面似乎是显而易见的解决方案。否则,您将面临重新实现StringBuilder的行为,不是吗?这并没有什么美感…+1:MSDN链接-+1:到目前为止,我喜欢这个答案。如果没有更好的结果,我会再等一段时间并接受它。@FabianBigler:请注意,因为a=b+c将导致a==b.+1:MSDN链接-+1:我喜欢这个答案。如果没有更好的结果,我会再等一段时间,接受这个事实。@FabianBigler:请注意,因为a=b+c将导致a==b。最大的s3=s1+s2;这仍然是一个问题。但是,LargeString可以像StringBuilder一样实现追加,然后按照自己的喜好实现内存管理。其他最大对象的列表?最大s3=s1+s2;这仍然是一个问题。但是,LargeString可以像StringBuilder一样实现追加,然后按照自己的喜好实现内存管理。其他大型物体的列表?