C#中如何强制引用。

时间:2022-08-30 17:33:21
int a = 1;
int b = a;  //如何强制使用引用
b = 3;

我期待结果a也为3。如何写代码。

19 个解决方案

#1


unsafe
{
    int a = 1;
    int* b = &a;
    *b = 3;
    Console.WriteLine(a);
}


函式參數使用ref。
http://msdn.microsoft.com/zh-cn/library/14akc2c7(VS.80).aspx

#2


两种“最有前途”的方式可以选择:
1. 自己高清楚业务封装含义,并且设计一个自定义对象。
2. 改学别的。

#3


值类型,赋值是拷贝,不是地址引用!

你的问题,可以使用引用类型
或者使用指针,操作a的地址

#4


值类型和引用类型不同,值类型不是地址引用。
硬是要a同时也变成3,要用引用类型包起来。

#5


做一个包装类

class RefType<T>
{
    public T Value { get; set; } 
}

#6


醉人的问题。看这个  http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/。Eric Lippert 原来写过一个实现返回ref和局部ref的c#编译器,找他要来就能支持啦

#7


这样做除了让你的代码更加混乱之外,还有其他意义吗

#8


按引用传递引用类型
class MyInfo
    {
        public string MyName;//定义一个字符串类型变量存储用户姓名
        public int MyAge;//定义一个整数类型变量存储用户年龄
        public MyInfo(string name, int age)//创建一个带参数的构造函数
        {
            MyName = name;
            MyAge = age;
        }
        public MyInfo() { }//默认构造函数
        public void PrintInfo()//创建一个公有方法输出用户年龄信息
        {
            Console.WriteLine("{0}年龄是{1}岁", MyName, MyAge);
        }
    }
    class Program
    {
        public static void SendAPersonByValue(ref MyInfo info)
        {
            info.MyAge = 99;//改变'info'的值
            info = new MyInfo("玛丽莲", 25);//”info”现在指向了堆上的一个新对象
        }
        static void Main(string[] args)
        {
            Console.WriteLine("输出用户年龄信息:");
            MyInfo fred = new MyInfo("李明丽", 29);
            Console.WriteLine("未改变用户信息前");
            fred.PrintInfo();
            SendAPersonByValue(ref fred);
            Console.WriteLine("改变后的用户年龄信息:");
            fred.PrintInfo();
        }
    }

#9


不管是foreach还是下标操作,都不能修改 list<值类型>,真是蛋疼。

“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。

#10


引用 9 楼 ml232528 的回复:
不管是foreach还是下标操作,都不能修改 list<值类型>,真是蛋疼。

“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。

List<int> L=new List<int>();
L.Add(1);
L[0]=2;

this[int]是个毛线啊

#11


this是关键字,表示当前类的实例,不要胡乱把变量名起名为this

#12


引用 9 楼 ml232528 的回复:
不管是foreach还是下标操作,都不能修改 list<值类型>,真是蛋疼。

“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。


这样其实挺好的,看看F#为了消除这种副作用,引入了Imutable变量,这种模式非常方便于实现并发和消除副作用

#13


引用 6 楼 github_22161131 的回复:
醉人的问题。看这个  http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/。Eric Lippert 原来写过一个实现返回ref和局部ref的c#编译器,找他要来就能支持啦

#14


            var a = 1;
            var b = new Func<int>( ()=>a );
            a = 3;
            Console.WriteLine(b());  //3

b()随a改变。c#没有匿名属性,这个思路无法完全符合你的要求,需要带着括号。

#15


int a
{
get{return b;}
set{b=value;}
}

#16


引用 11 楼 Z65443344 的回复:
this是关键字,表示当前类的实例,不要胡乱把变量名起名为this


错误是这样来的
 

 struct Mystruct
    {
        public int test;
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Mystruct> temp = new List<Mystruct>();

            for (int i = 0; i != temp.Count; ++i )
            {
                temp[i].test = 1;
            }
        }

            

#17


该回复于2015-01-17 11:07:20被管理员删除

#18


C#中如何强制引用。
值类型怎么引?
指向它的地址
就是引用了。
C#中如何强制引用。

void* SetHandleCount(ref int value);

#19


C#中如何强制引用。
byte[] buffer;

byte* = buffer;
byte** = &buffer;

#1


unsafe
{
    int a = 1;
    int* b = &a;
    *b = 3;
    Console.WriteLine(a);
}


函式參數使用ref。
http://msdn.microsoft.com/zh-cn/library/14akc2c7(VS.80).aspx

#2


两种“最有前途”的方式可以选择:
1. 自己高清楚业务封装含义,并且设计一个自定义对象。
2. 改学别的。

#3


值类型,赋值是拷贝,不是地址引用!

你的问题,可以使用引用类型
或者使用指针,操作a的地址

#4


值类型和引用类型不同,值类型不是地址引用。
硬是要a同时也变成3,要用引用类型包起来。

#5


做一个包装类

class RefType<T>
{
    public T Value { get; set; } 
}

#6


醉人的问题。看这个  http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/。Eric Lippert 原来写过一个实现返回ref和局部ref的c#编译器,找他要来就能支持啦

#7


这样做除了让你的代码更加混乱之外,还有其他意义吗

#8


按引用传递引用类型
class MyInfo
    {
        public string MyName;//定义一个字符串类型变量存储用户姓名
        public int MyAge;//定义一个整数类型变量存储用户年龄
        public MyInfo(string name, int age)//创建一个带参数的构造函数
        {
            MyName = name;
            MyAge = age;
        }
        public MyInfo() { }//默认构造函数
        public void PrintInfo()//创建一个公有方法输出用户年龄信息
        {
            Console.WriteLine("{0}年龄是{1}岁", MyName, MyAge);
        }
    }
    class Program
    {
        public static void SendAPersonByValue(ref MyInfo info)
        {
            info.MyAge = 99;//改变'info'的值
            info = new MyInfo("玛丽莲", 25);//”info”现在指向了堆上的一个新对象
        }
        static void Main(string[] args)
        {
            Console.WriteLine("输出用户年龄信息:");
            MyInfo fred = new MyInfo("李明丽", 29);
            Console.WriteLine("未改变用户信息前");
            fred.PrintInfo();
            SendAPersonByValue(ref fred);
            Console.WriteLine("改变后的用户年龄信息:");
            fred.PrintInfo();
        }
    }

#9


不管是foreach还是下标操作,都不能修改 list<值类型>,真是蛋疼。

“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。

#10


引用 9 楼 ml232528 的回复:
不管是foreach还是下标操作,都不能修改 list<值类型>,真是蛋疼。

“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。

List<int> L=new List<int>();
L.Add(1);
L[0]=2;

this[int]是个毛线啊

#11


this是关键字,表示当前类的实例,不要胡乱把变量名起名为this

#12


引用 9 楼 ml232528 的回复:
不管是foreach还是下标操作,都不能修改 list<值类型>,真是蛋疼。

“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。


这样其实挺好的,看看F#为了消除这种副作用,引入了Imutable变量,这种模式非常方便于实现并发和消除副作用

#13


引用 6 楼 github_22161131 的回复:
醉人的问题。看这个  http://ericlippert.com/2011/06/23/ref-returns-and-ref-locals/。Eric Lippert 原来写过一个实现返回ref和局部ref的c#编译器,找他要来就能支持啦

#14


            var a = 1;
            var b = new Func<int>( ()=>a );
            a = 3;
            Console.WriteLine(b());  //3

b()随a改变。c#没有匿名属性,这个思路无法完全符合你的要求,需要带着括号。

#15


int a
{
get{return b;}
set{b=value;}
}

#16


引用 11 楼 Z65443344 的回复:
this是关键字,表示当前类的实例,不要胡乱把变量名起名为this


错误是这样来的
 

 struct Mystruct
    {
        public int test;
    }

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            List<Mystruct> temp = new List<Mystruct>();

            for (int i = 0; i != temp.Count; ++i )
            {
                temp[i].test = 1;
            }
        }

            

#17


该回复于2015-01-17 11:07:20被管理员删除

#18


C#中如何强制引用。
值类型怎么引?
指向它的地址
就是引用了。
C#中如何强制引用。

void* SetHandleCount(ref int value);

#19


C#中如何强制引用。
byte[] buffer;

byte* = buffer;
byte** = &buffer;

#20