可能重复:
How do I assign by “reference” to a class field in c#?
大家好 - 请告诉我如何使这项工作?基本上,我需要一个整数引用类型(int *可以在C ++中工作)
class Bar
{
private ref int m_ref; // This doesn't exist
public A(ref int val)
{
m_ref = val;
}
public void AddOne()
{
m_ref++;
}
}
class Program
{
static void main()
{
int foo = 7;
Bar b = new Bar(ref foo);
b.AddOne();
Console.WriteLine(foo); // This should print '8'
}
}
我必须使用拳击吗?
修改 也许我应该更具体一点。我正在编写一个BitAccessor类,它只允许访问各个位。这是我想要的用法:
class MyGlorifiedInt
{
private int m_val;
...
public BitAccessor Bits {
return new BitAccessor(m_val);
}
}
用法:
MyGlorifiedInt val = new MyGlorifiedInt(7);
val.Bits[0] = false; // Bits gets a new BitAccessor
Console.WriteLine(val); // outputs 6
要使BitAccessor能够修改m_val,它需要对它进行引用。但是我想在很多地方使用这个BitAccessor,只需要引用所需的整数。
答案 0 :(得分:7)
您不能直接存储对这样的整数的引用,但可以存储对包含它的GlorifiedInt
对象的引用。在你的情况下,我可能做的是使BitAccessor
类嵌套在GlorifiedInt
内(以便它可以访问私有字段),然后在this
时传递给m_val
的引用。它已创建,然后可用于访问class Program
{
static void Main(string[] args)
{
var g = new GlorifiedInt(7);
g.Bits[0] = false;
Console.WriteLine(g.Value); // prints "6"
}
}
class GlorifiedInt
{
private int m_val;
public GlorifiedInt(int value)
{
m_val = value;
}
public int Value
{
get { return m_val; }
}
public BitAccessor Bits
{
get { return new BitAccessor(this); }
}
public class BitAccessor
{
private GlorifiedInt gi;
public BitAccessor(GlorifiedInt glorified)
{
gi = glorified;
}
public bool this[int index]
{
get
{
if (index < 0 || index > 31)
throw new IndexOutOfRangeException("BitAcessor");
return (1 & (gi.m_val >> index)) == 1;
}
set
{
if (index < 0 || index > 31)
throw new IndexOutOfRangeException("BitAcessor");
if (value)
gi.m_val |= 1 << index;
else
gi.m_val &= ~(1 << index);
}
}
}
}
字段。以下是一个可以满足您需求的示例:
{{1}}
答案 1 :(得分:3)
您不需要引用整数 - 只需将整数放在引用类型中 - 这几乎就是您已经完成的操作。只需更改此行:
Console.WriteLine(foo);
为:
Console.WriteLine(bar.Value);
然后为类Bar
添加适当的访问者,并删除编译错误(删除ref
个关键字)。
另一种方法是通过引用将整数传递给函数:
static void AddOne(ref int i)
{
i++;
}
static void Main()
{
int foo = 7;
AddOne(ref foo);
Console.WriteLine(foo);
}
输出:
8
答案 2 :(得分:-1)
您没有指明您反对不安全的代码,因此这应该有效:
unsafe class Bar {
private int* m_ref;
public Bar(int* val) {
m_ref = val;
}
public void AddOne() {
*m_ref += 1;
}
}
unsafe class Program {
static void Main() {
int foo = 7;
Bar b = new Bar(&foo);
b.AddOne();
Console.WriteLine(foo); // prints 8
Console.ReadLine();
}
}
我从来没有在C#中使用指针,但似乎有用。我只是不确定可能的副作用是什么。
答案 3 :(得分:-1)
这不会直接回答您的问题,但您不能只使用System.Collections.BitArray类吗?
只是想知道你是否“重新发明轮子”?