我目前正在处理一个函数,其中传递了一个对象(自写类型Catalog),并且不会在被调用的函数中进行Mutations /更改.这里有一个简单的例子.


public override bool Migrate(in Catalog fromCatalog)
{
    fromCatalog.SupplierId = 1; //works, but why
}

我想要严格 destruct 这种行为和disallow mutating any properties个传递的对象.

推荐答案

因为in修饰符仅适用于变量(本例中的参数).它可以防止将参数值更改为引用不同的对象.

public bool Migrate(in Catalog fromCatalog)
{
/* Error CS8331  Cannot assign to variable 'fromCatalog' 
or use it as the right hand side of a ref assignment 
because it is a readonly variable */
    fromCatalog = new Catalog(); 

    fromCatalog.SupplierId = 1;
}

并创建对象的浅表副本,这样您就不会更改传递的对象中的任何内容(在类中)

example:

public Catalog CreateACopy()
{
    Catalog obj = (Catalog)this.MemberwiseClone();
    // and other...
    return obj;
}
        

utilization:

public class Program 
{
    private static void Main()
    {
        Catalog catalog = new Catalog();
        new Program().Migrate(catalog.CreateACopy());
    }
    public bool Migrate(in Catalog fromCatalog)
    {
        fromCatalog.SupplierId = 1;
    }
}

Csharp相关问答推荐

在C#c/await中,延迟长度是否会影响控制返回调用者?

C#中的两个线程之间读写浮点类型

当打印一行x个项目时,如何打印最后一行项目?

如何从HttpContext获取请求正文

dotnet集合中内部数组的局部变量副本的用途是什么?'

MudBlazor—MudDataGrid—默认过滤器定义不允许用户修改基本过滤器

mocking对象的引发事件并作为用于调用方法的参数对象传递到那里

C#EF Core WHERE IN LINQ FROM LIST WITH.CONTAINS不返回任何内容

C#无法让WinForm进度条生成动画错误跨线程操作无效

如何在毛伊岛应用程序中完美地同步视图模型和视图的加载?

如何使用XmlSerializer序列化带有CDATA节的XML文件?

在使用StringBuilder时,如何根据 colored颜色 设置为richTextBox中的特定行着色?

如何在onNext之前等待订阅者完成?

有条件地定义预处理器指令常量

为什么我的用户界面对象移动到略低于实际目标?

如何在特定环境中运行dotnet测试?

类/值和日期的泛型方法

我想根据姓氏按字母顺序对包含150行徽章编号、姓氏、名字、地址等的文件进行排序.e

使用DI实例化带有动态参数的服务?

将列表转换为带有逗号分隔字符串形式的值的字典