我是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
,而不创建新对象。temp
和a
都指向同一对象。
ref
本地
这是一种更简单的方法,但它只适用于局部变量。例如,不能将其用于字段。
public void change2()
{
ref int temp = ref universal.a; //change in temp gives change in a
temp -= 5;
}
C#有references
,它们与指针非常相似。如果a
和b
都是对同一对象的引用,则在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
,则a
和b
将不再是引用,并且将写入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答案的最后一部分相同,但我将把它留在这里,因为它只关注该解决方案。]