Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C#中是否有重载赋值运算符的解决方法? 不同于C++,在C语言中,不能重载赋值操作符。_C#_Operator Overloading - Fatal编程技术网

在C#中是否有重载赋值运算符的解决方法? 不同于C++,在C语言中,不能重载赋值操作符。

在C#中是否有重载赋值运算符的解决方法? 不同于C++,在C语言中,不能重载赋值操作符。,c#,operator-overloading,C#,Operator Overloading,我正在为非常大的数的算术运算做一个自定义的数字类,我希望它具有内置数字类型的外观和感觉,如int、decimal等。我已经重载了算术运算符,但赋值仍然 下面是一个例子: Number a = new Number(55); Number b = a; //I want to copy the value, not the reference 是否有解决问题的方法? < P>你不能在C++的周围工作,因为A= B;C++中的其他语义比C语言中的语义要多。在C#中,a=b;指向同一个对象,如b。

我正在为非常大的数的算术运算做一个自定义的数字类,我希望它具有内置数字类型的外观和感觉,如int、decimal等。我已经重载了算术运算符,但赋值仍然

下面是一个例子:

Number a = new Number(55); 
Number b = a; //I want to copy the value, not the reference

是否有解决问题的方法?

< P>你不能在C++的周围工作,因为A= B;C++中的其他语义比C语言中的语义要多。在C#中,a=b;指向同一个对象,如b。在C++中,A= B改变了A的内容。两者都有起伏。就像你一样

MyType * a = new MyType();
MyType * b = new MyType(); 
a = b; /* only exchange pointers. will not change any content */
在C++中(它将失去对第一个对象的引用,并创建内存泄漏。但是我们忽略这里)。您不能在C++中为其赋值操作符超载。

解决方法很简单:

MyType a = new MyType();
MyType b = new MyType();

// instead of a = b
a.Assign(b);
免责声明:我不是C#开发者

您可以创建这样的只写属性。然后做a。Self=b;上面

public MyType Self {
    set {
        /* copy content of value to this */
        this.Assign(value);
    }
}

现在,这不是好的。因为它违反了最小惊喜原则(POLS)。如果一个人做了a,他就不会期望a会改变。Self=b

传递引用时,您可以使类不可变,而不是复制数据。当类是不可变的时,对它有多个引用不是问题,因为它不能被更改


更改数据的操作当然会返回新实例。

我仍然不清楚您是否真的需要它。要么:

  • 您的数字类型应该是结构(这是可能的-数字是最常见的结构示例)。请注意,您希望您的类型表现为的所有类型(int、decimal等)都是结构
或:

  • 您的数字类型应该是不可变的,使每个变异操作都返回一个新实例,在这种情况下,您不需要在赋值时复制数据。(事实上,您的类型应该是不可变的,无论它是否是结构。可变结构是邪恶的,数字当然不应该是可变引用类型。)

您可以使用“隐式”关键字为分配创建重载:

假设您有一个像Foo这样的类型,您觉得它可以从字符串隐式转换。 您将在Foo类中编写以下静态方法:

public static implicit operator Foo(string normalString)
{
    //write your code here to go from string to Foo and return the new Foo.
}
完成后,您可以在代码中使用以下内容:

Foo x = "whatever";

早些时候的一篇帖子建议:

公共静态隐式运算符Foo(字符串normalString){}

我试过这个方法。。。但要使其发挥作用,您需要:

公共静态隐式运算符Foo(Foo-original){}


而且编译器不会让您从您的确切类型或您自己的任何基类型获得隐式转换函数。这是有道理的,因为这将是一种重写赋值运算符的后门方式,而C#不允许这样做

也许你想要的东西可以用C#访问器解决


以下是一个适合我自己的解决方案:

public class MyTestClass
{
   private int a;
   private string str;

   public MyTestClass()
   {
      a = 0;
      str = null;
   }

   public MyTestClass(int a, string str)
   {
      this.a = a;
      this.str = str;
   }

   public MyTestClass Clone
   {
      get
      {
         return new MyTestClass(this.a, this.str);
      }
   }
}
代码中的其他地方:

MyTestClass test1 = new MyTestClass(5, "Cat");
MyTestClass test2 = test1.Clone;


解释这个问题(你为什么需要它)。对不起,也许我应该更具体一些。我正在为非常大的数的算术运算创建一个自定义的数字类,我希望它具有内置数字类型(如int、decimal等)的外观和感觉。我已经重载了算术运算符,但赋值仍然是…谢谢-我已经为问题本身添加了您的注释。下面是一个示例:数字a=新数字(55); 数字b=a;我希望它复制值,而不是引用。看看DateTime和TimeSpan。那里有很多方法。如果它实际上是一个原子值,那么它可能应该是一个结构。数字几乎总是属于这一类。也许我可以这样做。但我的意思是——一种解决方法,它给了我赋值运算符重载的真实外观和感觉,所以我可以直截了当地说:MyType a=new MyType();MyType b=新的MyType();a=b;它执行一些自定义的赋值逻辑。关于它为什么不起作用的描述非常准确。正如你所建议的,但是,自我属性的概念并不那么好,“在C++中,A= B改变了A的内容”——这不完全正确。这取决于a和b是否是指针。a=b可以指向b,或者它可以调用你的=重载并将内容复制到a。@MickyDuncan Eh。。这是完全正确的。如果a和b是指针,你认为它们的内容是什么?在什么意义上,“只有复制指针”与“内容是指针时的复制内容”不同?@ DAG C++ =赋值可以使指针指向同一对象,或者根据变量类型更改内容。一个没有确定我们所说的只是指针是的,也许结构的想法是好的。我喜欢不变性选项——这是在另一个答案中提出的。谢谢,我会试试你的建议。可变结构可能是邪恶的,但C#团队认为它们适合枚举器。我认为将其作为一般规则来说更为正确。如果可以阻止对象共享,那么可变性并不是坏事。这可以通过实现需要某种形式的赋值重载的线性类型来实现。酷,这回答了我要问的一个问题;)这不是只有在您尝试将一种类型分配给另一种类型时才起作用吗?毕竟,这是一个隐含的演员阵容。如果你想把
Number
分配给
Number
@Jonathan Wood,我认为这不会有什么帮助-这正是我要找的!非常感谢@drew noakes:如果您想将数字指定给数字,并且数字是一个结构,您可以使用默认的赋值运算符获得所需的效果:按值赋值。@Nilzor,在这种情况下,您可以获得您所说的值的副本,但OP希望用自己的代码以某种方式控制该过程。我认为这是不可能的,除非你在两种类型之间适应。因此,与C++中所能做的稍微不同。