我有一段代码,类似于在C ++中实现智能指针的方式。
template <class T>
class WrapObject
{
public:
WrapObject(T* data)
{
_data = data;
}
T* operator->()
{
return _data;
}
private:
T* _data;
};
class Hello
{
public:
void sayHello()
{
std::cout << "hello world" << std::endl;
}
};
int main() {
Hello h;
WrapObject<Hello> wh(&h);
wh->sayHello();
return 0;
}
在main函数中,我们可以使用operator&#39; - &gt;&#39;直接从WrapObject访问Hello对象的所有方法。
有没有办法在C#或Java中做这样的事情?
答案 0 :(得分:0)
C#类型分为&#39;值类型&#39;和&#39;参考类型&#39;
引用类型(如类,接口)就像C ++中的指针一样,值保存在堆中,堆栈保存堆的地址。
值类型(例如int,long,char,struct)保存在堆栈上。
C#只有值类型支持指针操作(您必须在项目中设置&#39;允许不安全的代码)。在C#中,您不能在堆栈上分配引用类型。您可以简单地认为引用类型是指针
public class MyClass
{
public string name { get; set; }
}
public struct MyStruce
{
public string name { get; set; }
}
static void Main()
{
//MyClass *myClass=new MyClass()
//*myClass->name="Lee";
MyClass myClass = new MyClass();
myClass.name = "Tom";
//MyStruce myStruce;
//myStruce.name="Jack";
MyStruce myStruce = new MyStruce();
myStruce.name = "Jack";
}
您的代码更改为C#
public class WrapObject<T>
{
private T _data;
public WrapObject(T data)
{
_data = data;
}
public T Data
{
get { return _data; }
}
}
public class Hello
{
public void SayHello()
{
Console.WriteLine("hello world");
}
}
static void Main()
{
Hello h = new Hello();
WrapObject<Hello> wh = new WrapObject<Hello>(h);
wh.Data.SayHello();
}