object类型对象 ref参数如何理解?
class Program
{
static void Main(string[] args)
{
Student stu = new Student { Name = "老王" };
test(ref stu);
Console.WriteLine(stu.Name);
Console.Read();
} static void test(Student stu)
{
stu = new Student { Name="刘哥" };
Console.WriteLine(stu.Name);
} static void test(ref Student stu)
{
stu = new Student { Name = "刘哥" };
Console.WriteLine(stu.Name);
}
} public class Student
{
public string Name { get; set; }
}
不加ref 和加了ref 很明显结果是不一样的
如何理解加了和不加的区别
首先要知道构造一个对象的时候,内存中堆栈的分配情况,stu这个变量在栈中,而对象在堆中,变量中存放的是堆的地址。
因此如果不加ref,参数就是一个副本,存放的是堆中的地址。如果我们不改变地址,(也就是我们不去new一个对象对这个副本指向新的堆地址),其实是没有区别的,为什么?因为无论怎么操作,始终改变的是堆中的对象,如果我们new了一个新的对象,那么这个副本的地址发生变化了,但是stu这个变量指向的地址呢?依然没有发生变化。
因此如果加了ref呢?传递的是什么呢,是stu本身,并不是stu的副本,所以如果为stu重新new一个对象,那么它指向的地址自然就改变了。
object类型对象 ref参数如何理解?的更多相关文章
- Type Object——类型对象
clr会为应用程序使用的每个类型创建一个内部数据结构,这种数据结构称为类型对象. 具有泛型类型参数的类型称为开放类型(open type),CLR禁止构造开放类型的任何实例. 代码引用一个泛型类型时, ...
- list,set中可以存放Object类型对象
List<JSONObject> series = new ArrayList<JSONObject>();
- C#动态设置匿名类型对象的属性
用C#写WPF程序, 实现功能的过程中碰到一个需求: 动态设置对象的属性,属性名称是未知的,在运行时才能确定. 本来这种需求可以用 Dictionary<string, object> 实 ...
- C#中的out参数/ref参数/params可变参数
out参数: out关键字 通过引用来传递参数,在定义方法和调用方法的时候都必须使用out关键字 简单来讲out可以用来返回多个参数类型. static void Main(string[] args ...
- 3、二、c# 面向对像编程。类,结构、C# 数据类型(引用类型、值 类型、指针类型)、ref参数与out参数、方法的重载、静态类型与静态成员、继承与多态、委托与事件
一.类 定义类使用class关键字. <access specifier> class class_name { // member variables 成员变量 <access s ...
- c# 把一个匿名对象赋值给一个Object类型的变量后,怎么取这个变量? c# dynamic动态类型和匿名类 详解C# 匿名对象(匿名类型)、var、动态类型 dynamic 深入浅析C#中的var和dynamic
比如有一个匿名对象,var result =......Select( a=>new { id=a.id, name=a.name});然后Object obj = result ;我怎 ...
- JavaScript对象 Object类型基础
前言 JavaScript 对象是整个语言学习的一个难点.本文主要带大家入门学习Object知识 对象定义 javascript的基本数据类型包括undefined.null.boolean.stri ...
- 设计模式之美:Type Object(类型对象)
索引 意图 结构 参与者 适用性 效果 相关模式 实现 实现方式(一):Type Object 的经典介绍. 实现方式(二):Type Object 在游戏设计中的使用. 意图 允许在运行时动态灵活的 ...
- 集合框架的类和接口均在java.util包中。 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换。
集合框架的类和接口均在java.util包中. 任何对象加入集合类后,自动转变为Object类型,所以在取出的时候,需要进行强制类型转换.
随机推荐
- (转)Openstack Cascading和Nova Cell
Openstack是看着AWS成长起来的,这点毋庸置疑:所以AWS大规模商用已成事实的情况下,Openstack也需要从架构和产品实现上进行优化,以满足大规模商用的要求.从已有的实现来看其中两种方式值 ...
- nova notification
1 compute.instance.update类型的消息 需要配置notify_on_state_change参数,可以为空,或者vm_state,或者vm_and_task_state, 当虚拟 ...
- Node.js核心模块_全局变量、util学习
全局对象 javascript的全局对象是window,他及其所有属性都可以在程序的任何地方访问.即全局变量. 而在node中全局对象是global,所有全局变量都是global对象的属性,包括其本身 ...
- JavaScript的DOM操作(节点操作)
创建节点createElement()var node = document.createElement(“div”);没什么可说的,创建一个元素节点,但注意,这个节点不会被自动添加到文档(docum ...
- oracle管理优化必备语句以及oracle SQL语句性能调整
本文转自http://www.dataguru.cn/article-3302-1.html oracle数据库管理优化必备语句: 1. SELECT T.START_TIME,T.USED_UBLK ...
- C++循环链表实现约瑟夫退圈(类封装)
node.h #pragma once #include <iostream> #include <iomanip> using namespace std; struct n ...
- msyql中myism和innodb的区别
MyISAM存储引擎 MyISAM是 默认存储引擎.它基于更老的ISAM代码,但有很多有用的扩展.MyISAM存储引擎的一些特征: ●所有数据值先存储低字节.这使得数据机和操作系统分离.二进制轻便性的 ...
- 242. Valid Anagram Add to List
Given two strings s and t, write a function to determine if t is an anagram of s. For example,s = &q ...
- Find The Multiple(DFS)
Given a positive integer n, write a program to find out a nonzero multiple m of n whose decimal repr ...
- 51nod 1685 第K大区间2
定义一个长度为奇数的区间的值为其所包含的的元素的中位数.中位数_百度百科 现给出n个数,求将所有长度为奇数的区间的值排序后,第K大的值为多少. 样例解释: [l,r]表示区间的值[1]:3[2]:1[ ...