C++程序员用C#中的指针替换
本文关键字:指针 替换 程序员 C++ | 更新日期: 2023-09-27 18:20:59
我主要是一名C++程序员,已经有几年没有接触过C#了(所以,如果我问的问题可能是我的大脑放屁,请原谅我)。
背景信息:我正在编写一个文件组织实用程序(只是为了好玩,并帮助清理我电脑上的重复项)。我已经能够对文件和文件进行MD5校验和,并在不同的子目录中找到重复的文件,有时具有相同的文件名,有时不具有(但总是相同的文件类型)。我最初只使用"MainFrom"代码后面的文件路径字符串和Winform对象、Arraylist、Arrays作为概念证明。代码真的很难看,我已经看得很困惑了,所以它肯定是不可维护的。
因此,我认为一个更优雅、更明智的设计是将其存储为一个对象,该对象将具有简单的东西,如文件路径、文件名、MD5、文件类型等(是的,我知道FILE)。然后我想,如果它引用了其他"重复"、"相似"的对象实例,那就有意义了。我希望创建一个指针数组,它是指向重复对象的对象的一部分。这样,在运行时,我可以查看所有重复项,找出它们的属性等。
我计划以后从这个类继承特定的文件类型,如mp3或jpg文件,在这些文件类型中我可以比较内容(例如:我可以识别哪些图片可能只是调整了大小的版本,并使它们相互指向)。但是C#没有指针。我在看代表,但话说回来,那不是我真正想要的。
我的困境:C#在托管代码中没有指针(除非万不得已,否则我不想使用非托管部分)。
我还考虑过创建一个arraylist之类的东西,并在运行时传递"对象"。但这不会产生重复吗?它实际上并不是对新对象的引用,是吗?
我非常感谢那些从C++到C#过渡的人给我的建议,告诉我如何超越这一点。如果我的设计完全错了,请随时告诉我。(我认为,由于它们都是面向对象的,所以这样的设计在两个世界都适用)。
我真的很感激引用其他可以提供帮助的源代码(因为我不是第一个尝试用c#编码的c++程序员)。提前感谢!
我的困境: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的东西,并在运行时传递"对象"。但这不会产生重复吗?它实际上并不是对新对象的引用,是吗?
不可以,ArrayList只能存储对对象的引用,因此通常不需要复制或克隆。这种情况只发生在值类型(int,double)中。但是一定要使用List<MyClass>
,以获得更多的功能和更少的类型转换。
简而言之,在继续之前,请先阅读"引用类型"、"值类型"answers"引用"。
C#中的引用类型(几乎)总是作为指针传递。如果我这样做:
var a = new Object();
var list1 = new List<Object>();
var list2 = new List<Object>();
list1.Add(a);
list2.Add(a);
我没有重复a。我只是在两个列表中都引用它。希望能有所帮助。
A a1;
A a2 = a1;
在C++中,上面的代码将使a1和a2成为两个相互复制的独立对象。在C#中,如果A被声明为类,那么a1和a2将引用一个相同的对象,因此您本身就不需要为试图实现的内容提供指针
当C#传递对象类型的引用时,您不必处理指针。
您应该了解C#作为集合提供的HashSet/generic Lists。
C#中类的实例是引用,因此类似于指针。在C#中,当您编写a = b
时,其中a
和b
是类的实例,唯一被复制的是对对象的引用。现在有两个对同一对象的引用。
当我读到你的问题时,C#参考资料将为你服务。
Arraylist在您的情况下会很好地工作。传递给arraylist的对象只是引用(类似于指针)。它们不会被重新创建,因此不会有任何重复。
解决C#中指针问题的另一种方法。WeakReference
。http://msdn.microsoft.com/en-us/library/ms404247.aspx
C#";共享指针";用于替代内存管理?
示例:
// Create the object
Book book = new Book("My first book", "Me");
// Set weak reference
WeakReference wr = new WeakReference(book);
// Remove any reference to the book by making it null
book = null;
if (wr.IsAlive)
{
Console.WriteLine("Book is alive");'
Book book2 = wr.Target as Book;
Console.WriteLine(book2.Title);
book2 = null;
}
else
Console.WriteLine("Book is dead");
// Lets see what happens after GC
GC.Collect();
// Should not be alive
if (wr.IsAlive)
Console.WriteLine("Book is alive");
else
Console.WriteLine("Book is dead");
输出应为
Book is alive
My first book
Book is dead
http://www.switchonthecode.com/tutorials/csharp-tutorial-weak-references