有什么像c#中的指针吗



我是c#的新手(通常是编码(,找不到任何等价的指针
当我在谷歌上搜索时,我得到了一些安全/不安全的东西,但这不是我需要的

就像在c++中一样,如果您有一个指针,并且它指向某个值,那么指针的更改将导致原始变量的更改。c#中有这样的东西吗
示例-

static class universal
{
public static int a = 10;
}
class class_a
{
public void change1()
{
universal.a--;
}
}
class class_b
{
public void change2()
{
some_keyword temp = universal.a; //change in temp gives change in a
temp-= 5; //the purpose of temp is to NOT have to write universal.a each time
}
}
...
static void Main(string[] args)
{
class_b B = new class_b();
class_a A = new class_a();
A.change1();
Console.WriteLine(universal.a);//it will print 9
B.change2();
Console.WriteLine(universal.a);//it will print 4
Console.ReadKey();
}

编辑-谢谢@Sweeper我得到了答案我不得不使用ref int temp=ref universal.a;

如果你不想要不安全的代码,我可以想出两个选项。

包装器对象

您可以创建这样一个类,该类封装int:

public class IntWrapper {
public int Value { get; set; }
}

然后将a的类型更改为此类:

static class Universal
{
public static IntWrapper a = new IntWrapper { Value = 10 };
}
class class_a
{
public void change1()
{
universal.a.Value--;
}
}
class class_b
{
public void change2()
{
Universal temp = universal.a; //change in temp gives change in a
temp.Value -= 5;
}
}

这是因为类是引用类型,并且a持有指向IntWrapper对象的引用(类似于指针(。=将引用复制到temp,而不创建新对象。tempa都指向同一对象。

ref本地

这是一种更简单的方法,但它只适用于局部变量。例如,不能将其用于字段。

public void change2()
{
ref int temp = ref universal.a; //change in temp gives change in a
temp -= 5;
}

C#有references,它们与指针非常相似。如果ab都是对同一对象的引用,则在b中也会看到a的变化。

例如,在:中

class X {
public int val;
}
void Main()
{
var a = new X();
var b = a;
a.val = 6;
Console.WriteLine(b.val);
}

将写入6

如果将X的声明从class更改为struct,则ab将不再是引用,并且将写入0

在c#Pass By Reference中使用的是指针,下面是更正后的代码

static class universal
{
public static int a = 10;
}
class class_a
{
public void change1()
{
universal.a--;
}
}
class class_b
{
public void change2(ref int val)//use ref keyword for reference
{
int temp = val; //change in temp gives change in a
val -= 5;
}
}
static void Main(string[] args)
{
class_b B = new class_b();
class_a A = new class_a();
A.change1();
Console.WriteLine(universal.a);//it will print 9
B.change2(ref universal.a); //pass value by reference using ref keyword
Console.WriteLine(universal.a);//it will print 4
Console.ReadKey();
}

在某些情况下(当非常需要优化时(,您可以使用几乎类似C的指针。您只能通过将代码放在unsafe作用域中明确指定您知道风险来做到这一点:

unsafe
{
int number = 777;
int* ptr = &number;
Console.WriteLine($"Data that pointer points to is: {number} ");
Console.WriteLine($"Address that pointer holds: {(int)ptr}");
}

不安全的上下文允许您直接使用指针。请注意,默认情况下,此选项在项目中处于关闭状态。若要对此进行测试,您需要右键单击项目>属性>生成-允许不安全代码

这样?

using System;
namespace Demo
{
class Program
{
static void Main()
{
var test = new class_a();
test.change1();
Console.WriteLine(universal.a); // Prints 18
}
}
static class universal
{
public static int a = 10;
}
class class_a
{
public void change1()
{
ref int x = ref universal.a;
++x;
++x;
++x;
x += 5;
}
}
}

[编辑:我注意到这与Sweeper答案的最后一部分相同,但我将把它留在这里,因为它只关注该解决方案。]

相关内容

  • 没有找到相关文章

最新更新