繁体   English   中英

将通用指针传递给c#中的方法

[英]Passing a generic pointer to a method in c#

我创建了一个通用类型来充当指针,以便可以通过引用传递。 (也许有一种更简单的方法可以做到这一点,但我想强调,我这样做是为了更多地了解泛型和通过引用传递,而不是完成任务的最有效方法,如果这是有道理的。)

这是我为泛型类型编写的代码

class GenericPointer<T> {
    public T item;
    public void setItem(T i){ item = i; }
    public T getItem(){ return item; }
}

在我的程序中,我创建了一个名为“ intPointer”的实例。 值143是任意的。

GenericPointer<int> intPointer = new GenericPointer<int>();
intPointer.setItem(143);
Console.WriteLine(intPointer.getItem());

上面的代码运行正常,设置并返回值143。

我现在想将这个'intPointer'传递给一个递增它的方法,然后再次打印该值。

所以我写了一个名为addone()的方法

public void addone(int i) { i ++; }

现在我想进行以下调用(记住我已经将值设置为143):

Console.WriteLine(intPointer.getItem());
addone(intPointer);
Console.WriteLine(intPointer.getItem());

我原本希望看到的是143,然后是144,但是出现以下错误:

The best overloaded method match for 'Notes.Program.addone(int)' has some invalid arguments

和:

cannot convert from 'Notes.GenericPointer<int>' to 'int'

任何帮助将不胜感激!

我将首先纠正你的一些术语:你没有使用指针。 C#确实支持指针,但使用unsafe关键字,它们是真正的指针(如在整数存储器地址中,您可以直接操作)。 您编写的代码只是装箱对象的示例。

.NET已经通过强制转换为Object来支持装箱; 但是不推荐也不需要它,因为ref关键字解决了你试图“修复”的问题。

使用ref关键字来描述应该按引用而不是按值传递的值类型参数。 所有其他语义保持不变,如下所示:

void Foo() {
    int x = 123;
    Bar(ref x);
    Console.Write( x ); // prints "124".
}
void Bar(ref int x) {
    x++;
}

我还有一些其他说明:

  1. C#和.NET约定规定所有公共成员(方法,属性,字段等)都应该有TitleCase,而不是camelCase(即确保首字母大写)。
  2. 不建议使用普通的getter和setter方法,而应使用Properties(尽管我注意到您不能将ref参数与properties一起使用)。
  3. 由于intPointer的类型不是int ,而是您的类GenericPointer<int>

虽然GenericPointer包装了一个int,但它实际上并不是一个int,因此它不能被视为一个int。 它具有int的属性。

想象一下,如果GenericPointer包裹了一个字符串。 AddOne会对此做些什么。

您可以对类的属性执行操作,但不将整个类视为其泛型类型。

可以编写一个采用通用指针参数的AddOne方法,然后检查其是否为整型,如果内部值为int,则将其添加到内部项中。 我确信这不是一个好主意。

你真的想用这个GenericPointer实现什么?

如果您希望参数是值类型(字符串,整数,布尔值等)的引用,则使您的参数像这样:

public void addone(ref int i)
{
    i++;
}

然后像这样调用方法:

addone(ref variableInt);

您还可以查看此内容 ,以了解如何使您的类作为特定类型工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM