2014-09-12 83 views
3

首先,对于可能令人困惑的标题感到抱歉,随时随地改变它,只要有人知道更合适的标题。C++到C#代码转换,参考与值类型的麻烦

我正在将一个数学库从C++移植到C#的过程中。移植实际的代码是在几天内完成的。然而,我一直在努力解决由于C#类是引用类型而C++类是值类型这一事实引发的所有错误。

让我解释一下:如果我在C++中有一个嵌套类Bar的Class Foo,并且如果我将Bar的现有实例分配给Foo,我基本上会复制它,如果C++编译器知道一种方法所以(如果我不使用指针,当然)

如果我在C#中做同样的工作,我分配一个引用。这导致难以置信的难以发现的副作用。如果在C#中,我的代码稍后在将其分配给Foo后修改了我的Bar实例,那么Foo.Bar对象当然也会被修改。不好。

所以我的问题是:有没有一种简单的方法,或最佳实践方法,当我假设我分配了一个副本时,在我的代码中查找指定引用的位置? 我甚至考虑每次在对象上调用getter时创建一个新对象,并在那里复制值。当然这意味着我再也不会对一个对象产生敬畏。再次,不好。

所以,基本上我问的是:如何找到每个出现的赋值运算符(=),其中TARGET是一个引用类型?这是我需要改变的那些代码行。

我试图通过简单地搜索'='字符来手动完成,但搜索成千上万行代码后,但我仍然错过了偶尔的分配目标。

+0

尽量避免嵌套类,除非你熟悉使用它们..我个人认为它可以导致你一些问题JoelFan也有一个很棒的建议,但也知道对于非常大的类型我会使用类vs一个结构 – MethodMan 2014-09-12 15:55:52

+0

在继续之前,请确保你知道C#非常好......我不能推荐这本书足够:http://www.amazon.com/C-Depth-3rd-Jon-Skeet/dp/161729134X/ref = sr_1_10?s = books&ie = UTF8&qid = 1410537373&sr = 1-10阅读本书的任何时间都会重新获得很多次 – JoelFan 2014-09-12 15:56:40

+0

我非常感谢您的意见。但是,我知道的时间非常有限。 *这是移植库几乎1:1 *的原因。我只是要求提供一些提示/提示/ ...手头的工作 – lightxx 2014-09-12 16:00:37

回答

5

你应该看看C#的struct功能,而不是class。结构是值类型。

+0

我认为结构是不可改变的,不是吗?或者至少我从阅读中得到了印象,我想到了结构,但是:然后:http://stackoverflow.com/questions/3751911/why-are-c-sharp-structs-immutable – lightxx 2014-09-12 15:55:55

+1

@lightxx可变的结构是邪恶的。它们存在,但使用它们几乎肯定是一个错误。当然,你刚刚联系的问题恰恰解释了这一点。 – Servy 2014-09-12 15:57:28

+1

其实......如果我将我的类转换为结构体,并且只是看看编译器炸弹的位置,我可能会发现这些分配目标是在哪里......嗯......我尽快在办公室试试再次... – lightxx 2014-09-12 16:02:36