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. 改学别的。
1. 自己高清楚业务封装含义,并且设计一个自定义对象。
2. 改学别的。
#3
值类型,赋值是拷贝,不是地址引用!
你的问题,可以使用引用类型
或者使用指针,操作a的地址
你的问题,可以使用引用类型
或者使用指针,操作a的地址
#4
值类型和引用类型不同,值类型不是地址引用。
硬是要a同时也变成3,要用引用类型包起来。
硬是要a同时也变成3,要用引用类型包起来。
#5
做一个包装类
class RefType<T>
{
public T Value { get; set; }
}
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();
}
}
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]”的返回值,因为它不是变量 。
“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。
#10
List<int> L=new List<int>();
L.Add(1);
L[0]=2;
this[int]是个毛线啊
#11
this是关键字,表示当前类的实例,不要胡乱把变量名起名为this
#12
这样其实挺好的,看看F#为了消除这种副作用,引入了Imutable变量,这种模式非常方便于实现并发和消除副作用
#13
顶
#14
var a = 1;
var b = new Func<int>( ()=>a );
a = 3;
Console.WriteLine(b()); //3
b()随a改变。c#没有匿名属性,这个思路无法完全符合你的要求,需要带着括号。
var b = new Func<int>( ()=>a );
a = 3;
Console.WriteLine(b()); //3
b()随a改变。c#没有匿名属性,这个思路无法完全符合你的要求,需要带着括号。
#15
int a
{
get{return b;}
set{b=value;}
}
{
get{return b;}
set{b=value;}
}
#16
错误是这样来的
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
#18
值类型怎么引?
指向它的地址
就是引用了。
void* SetHandleCount(ref int value);
#19
byte[] buffer;
byte* = buffer;
byte** = &buffer;
#20
#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. 改学别的。
1. 自己高清楚业务封装含义,并且设计一个自定义对象。
2. 改学别的。
#3
值类型,赋值是拷贝,不是地址引用!
你的问题,可以使用引用类型
或者使用指针,操作a的地址
你的问题,可以使用引用类型
或者使用指针,操作a的地址
#4
值类型和引用类型不同,值类型不是地址引用。
硬是要a同时也变成3,要用引用类型包起来。
硬是要a同时也变成3,要用引用类型包起来。
#5
做一个包装类
class RefType<T>
{
public T Value { get; set; }
}
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();
}
}
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]”的返回值,因为它不是变量 。
“foreach 迭代变量”,因此无法修改其成员。
无法修改this[int]”的返回值,因为它不是变量 。
#10
List<int> L=new List<int>();
L.Add(1);
L[0]=2;
this[int]是个毛线啊
#11
this是关键字,表示当前类的实例,不要胡乱把变量名起名为this
#12
这样其实挺好的,看看F#为了消除这种副作用,引入了Imutable变量,这种模式非常方便于实现并发和消除副作用
#13
顶
#14
var a = 1;
var b = new Func<int>( ()=>a );
a = 3;
Console.WriteLine(b()); //3
b()随a改变。c#没有匿名属性,这个思路无法完全符合你的要求,需要带着括号。
var b = new Func<int>( ()=>a );
a = 3;
Console.WriteLine(b()); //3
b()随a改变。c#没有匿名属性,这个思路无法完全符合你的要求,需要带着括号。
#15
int a
{
get{return b;}
set{b=value;}
}
{
get{return b;}
set{b=value;}
}
#16
错误是这样来的
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
#18
值类型怎么引?
指向它的地址
就是引用了。
void* SetHandleCount(ref int value);
#19
byte[] buffer;
byte* = buffer;
byte** = &buffer;