我主要是一个C++程序员,几年没有碰过c#了(所以,如果我问的问题可能是我的大脑屁,请原谅我)。
背景信息:我正在编写一个文件组织实用程序(只是为了好玩,并帮助清理我的计算机上的副本)。我已经能够对文件和文件执行MD5校验和,并在不同的子目录中找到重复的文件,有时使用相同的文件名,有时不是(尽管总是相同的文件类型)。我最初是通过使用文件路径字符串和Winform、Arraylist、"MainFrom“后面代码中的数组作为概念的证明来做到这一点的。代码真的很难看,我已经对它感到困惑了,所以它肯定是不可维护的。
因此,我想,一个更优雅和明智的设计是将其存储为一个对象,其中包含文件路径、文件名、MD5、fileType等简单内容(是的,我知道文件)。然后我想,如果它引用了其他对象的实例,这些对象是“重复的”,“相似的”,这是有意义的。我希望创建一个指针数组,它是指向重复对象的对象的一部分。这样,在运行时,我可以遍历所有的副本,找出它们的属性等等。
我计划稍后从该类继承特定的文件类型,例如mp3或jpg文件,在这些文件中,我可以比较内容(例如:我可以识别哪些图片可以简单地调整彼此的大小,并让它们相互指向)。但是C#没有指针。我在看代表们,但话又说回来,这并不是我真正想要的。
我的困境: C#在托管代码中没有指针(除非绝对必要,否则我不想使用非托管部分)。
我还考虑过创建类似数组的东西,并在运行时传入“对象”。但这不是制造重复的吗?它实际上不是对新对象的引用,对吗?
对于我如何超越这一点,我真的很感激那些曾经做过C++ to C# transition的人的建议。如果我完全搞错了设计,请随时通知我。(我假设,由于它们都是面向对象的,这样的设计在两种情况下都是可行的)。
我非常感谢对其他资源的引用,因为我不是第一个试图在c++中编码的C#编码器。提前感谢!
发布于 2012-01-20 16:54:25
我的困境: C#在托管代码中没有指针
但是它在任何地方都对对象(包括数组)使用引用。
var a = new StringBuilder();
var b = a; // a and b now refer to the same single StringBuilder instance
a.Append("!"); // equivalent to a->Append("!"); in C++那么,您认为(只有)指针才能解决的实际上缺少了哪些功能呢?
创建类似数组的内容,并在运行时传入“对象”。但这不是制造重复的吗?它实际上不是对新对象的引用,对吗?
否,ArrayList只能存储对对象的引用,因此通常不需要复制或克隆。这只发生在值类型(int,double)上。但是一定要使用List<MyClass>,以获得更多的功能和更少的类型转换。
简而言之,在继续之前,先阅读一下引用类型、值类型和引用。
发布于 2012-01-20 16:54:23
C#中的引用类型(几乎)总是作为指针传递。如果我这样做了:
var a = new Object();
var list1 = new List<Object>();
var list2 = new List<Object>();
list1.Add(a);
list2.Add(a);我不是在复制a,我只是在两个列表中都提到了它。希望这能有所帮助。
发布于 2012-01-20 16:54:42
A a1;
A a2 = a1;在C++中,上面的代码将使a1和a2成为彼此副本的两个单独的对象。在C#中,如果A被声明为类,则a1和a2将引用一个相同的对象,这样就不会为试图获取的对象本身提供指针。
https://stackoverflow.com/questions/8944918
复制相似问题