我已经为链接调用定制了一个C#类来添加我的样式,但是当我第一次创建Style类的实例,然后使用链接调用时,它最后只显示第一个添加的样式.

以下是代码:

MyStyleBuilder:

namespace TestStyleBuilder
{
    public struct MyStyleBuilder
    {

        private string stringBuffer;

        public MyStyleBuilder AddLineColor(string value) => this.AddStyle("color", value);

        public MyStyleBuilder AddLineDash(string value) => this.AddStyle("dash", value);

        public MyStyleBuilder AddStyle(string prop, string value)
        {
            var style = $"{prop}:{value};";
            stringBuffer += style;
            return this;
        }

        public override string ToString()
        {
            return stringBuffer != null ? stringBuffer.Trim() : string.Empty;
        }
    }
}

测试:

using TestStyleBuilder;

// Output:
// color:color;dash:dash;
MyStyleBuilder builder1 = new MyStyleBuilder().AddLineColor("color").AddLineDash("dash");
Console.WriteLine(builder1.ToString());

// Output:
// color:color;
MyStyleBuilder builder2 = new MyStyleBuilder();
builder2.AddLineColor("color").AddLineDash("dash");
Console.WriteLine(builder2.ToString());

经过调试和跟踪,我发现MyStyleBuilder中添加了所有的样式,但当返回测试类时,只添加了一个样式.

我的猜测是,在第二个示例中,返回的This不等同于Builder2,这是导致此行为的原因.

然而,我不确定如何修改它以达到第二种方法中连续添加样式的预期效果.

推荐答案

当您从 struct 方法返回return this时,将返回this的副本,因为 struct 具有值语义.

builder2.AddLineColor("color")正在修改builder2.stringBuffer,但AddLineDash("dash")正在修改builder2.AddLineColor("color")返回的副本的stringBuffer.这就是为什么当你判断builder2.stringBuffer的时候,只应用了 colored颜色 .AddLineDash("dash")返回的副本同时应用了这两种样式,但您没有为任何内容赋值而放弃了这一点.

可以将链的结果指定给builder2:

builder2 = builder2.AddLineColor("color").AddLineDash("dash");

或者只需将MyStyleBuilder更改为class,这将为其提供引用语义.

public class MyStyleBuilder

See also What's the difference between struct and class in .NET?

Csharp相关问答推荐

需要更改哪些内容才能修复被覆盖的财产中的无效警告CS 8765?

将修剪声明放入LINQ中

哪个nuget包含SecurityStampValidatorOptions

System.Text.Json数据化的C#类映射

将XPS转换为PDF C#

选取器与.NET Maui MVVM的绑定属性

自动映射程序在GroupBy之后使用项目

使用C#HttpClient以多部分形式数据发送带有非ASCII文件名的文件的问题

使用带有参数和曲面的注入失败(&Q;)

DbContext-传递自定义配置选项

Regex字母数字校验

如何在使用属性 Select 器时判断是否可以为空

序列化过程中的死循环

如何将默认区域性更改为fr-FR而不是en-US?

工厂类是如何在.NET 8中注册的?

将两个for循环更改为一条LINQ语句

在C#和HttpClient中使用REST API

使用LibraryImport在多个dll中导入相同的函数

如果所有";async任务方法()";调用都返回Task.FromResult()-是否同步执行?

C#Web服务转换为 node /Express不工作