什么像 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
与指针非常相似。如果 a
和 b
都是对同一对象的引用,则 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
,则a
和b
将不再是引用,并且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
的引用,而不创建新对象。 temp
和 a
指的是同一个对象。
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 回答的最后一部分相同,但我会把它留在这里,因为它只关注该解决方案。]
我是 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
与指针非常相似。如果 a
和 b
都是对同一对象的引用,则 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
,则a
和b
将不再是引用,并且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
的引用,而不创建新对象。 temp
和 a
指的是同一个对象。
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 回答的最后一部分相同,但我会把它留在这里,因为它只关注该解决方案。]