什么像 C# 中的指针?

anything like pointers in c#?

我是 c# 的新手(一般来说是编码),我找不到任何等效的指针。
当我搜索 google 时,我得到了类似 safe/unsafe 的东西,但这不是我需要的。

就像在 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;

C# 有 references 与指针非常相似。如果 ab 都是对同一对象的引用,则 a 中的更改也将在 b.

中看到

例如,在:

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 将被写入。

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

包装对象

您可以像这样创建一个 class,它包装一个 int:

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

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

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;
   }
}

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

ref locals

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

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

在某些情况下(当非常需要优化时)您几乎可以使用类似于 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}");
}

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

在 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();
}

像这样?

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 回答的最后一部分相同,但我会把它留在这里,因为它只关注该解决方案。]