我理解c#(一): 参数传递和变量复制之间的关系

值类型和引用类型详解(C#) 值类型和引用类型,是c#比较基础,也必须掌握的知识点,但是也不是那么轻易就能掌握,今天跟着我一起来看看吧。 阅读详情

1.当参数是值类型与引用类型的区别和联系

2.当参数string的时候与值类型的区别

 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleCSharp
{
    class classtest
    {
        public int test;
        public string str;
        public classtest()
        {
            test = 0;
            str = "";
        }
    }
    struct structtest
    {
        public int test;
        public string str;
    }
    class Program
    {
        // ==与Equals一致,对值类型比较的是值相等,对于引用类型比较的是两地址是否相等
        //  对于预定义的值类型,如果操作数的值相等,则相等运算符       (==)       返回真,否则,返回假。
        //  对于除       string       类型以外的引用类型,如果两个操作数引用相同的对象,则       ==       返回真。
        // 对于       string       类型,==       将比较字符串的值。

        //  public static bool ReferenceEquals( object left, object right );
        //这个函数就是判断两个引用类型对象是否指向同一个地址。有此说明后,就确定了它的使用范围,即只能对于引用类型操作。
        //那么对于任何值类型数据操作,即使是与自身的判别,都会返回false。这主要因为在调用此函数的时候,值类型数据要进行装箱操作

        static void Main(string[] args)
        {
            classtest ct = new classtest();
            changeValue(ct);
            classtest ct1 = ct;
            Console.WriteLine("class : {0} {1} {2}", ct1 == ct, ct1.Equals(ct), object.ReferenceEquals(ct1, ct)); //True  True
            Console.WriteLine("{0} {1}", ct.test, ct.str);
            // 首先在C#中传递方法参数缺省是“值拷贝”模式,也就是说对于值类型(ValueType)变量直接拷贝一份,
            // 而对于引用类型则拷贝一个指向同一对象的引用副本传递给方法,因此即使不使用ref关键字,
            // 我们也可以在方法内部改变该引用所指向对象的内部状态

            structtest st = new structtest();
            changeValue(st);
            structtest st1 = st;
            Console.WriteLine("struct : {0} {1} ", st1.Equals(st), object.ReferenceEquals(st1, st));
            Console.WriteLine("{0} {1}", st.test, st.str);

            int i = 0;
            int j = i;
            Console.WriteLine("int : {0} {1} {2}", i == j, i.Equals(j), object.ReferenceEquals(i, j));
            changeValue(i);
            Console.WriteLine(i);

            string ss = "ss";
            string ss2 = ss;
            Console.WriteLine("string {0} {1} {2}", ss2 == ss, ss2.Equals(ss), object.ReferenceEquals(ss2, ss));
            changeValue(ss);
            Console.WriteLine(ss);
            // string对象保存在堆上而不是堆栈上,是引用类型的,因而当把一个字符串变量赋给另一个字符串时,
            // 会得到对内存中同一个字符串的两个引用.
            //然后,修改其中一个字符串,注意这会创建一个完全新的string对象,而另一个字符串没改变!

        }
        static void changeValue(classtest t)
        {
            t.test += 100;
            t.str += "class";
        }
        static void changeValue(int i)
        {
            i += 100;
        }
        static void changeValue(string i)
        {
            i += "string";
        }
        static void changeValue(structtest t)
        {
            t.test += 200;
            t.str += "struct";
        }

    }
}

C# 程序实现文件复制 在C#编程中,文件复制是一个常见的任务。我们将展示一个简单的示例代码,演示如何使用System.IO命名空间中的类来完成文件复制操作。当你运行该程序时,它将读取源文件的内容并将其复制到目标文件中。如果文件复制成功,程序将打印出"文件复制完成"的消息。首先,我们需要在C#中引用System.IO命名空间,该命名空间提供了用于文件和文件夹操作的类和方法。然后,我们打印出"文件复制完成"的消息,并等待用户按下Enter键以终止程序的执行。方法中,我们定义了源文件路径和目标文件路径,并将它们作为参数传递给。 阅读详情

相关推荐

深入理解C#中的ref和out参数传递

简介:C#中,ref和out关键字允许按引用传递参数,以修改实参的值。两者存在区别:ref要求参数必须已初始化且可以读写,而out允许参数在方法内部初始化且主要用于输出。正确理解和使用这两个关键字对于编写高效和可维护的C#代码至关重要。

weixin_32102617的博客 1405

C#深度复制和浅度复制详解

C#深度复制和浅度复制 复制一个值变量很简单,新建一个变量然后将原来的变量赋值过去就行,但是复制一个引用变量这种方法是不行的,如果不明白为什么可以先看看这篇解释 引用类型变量和值类型变量在赋值时的不同 如果要复制一个引用类型的变量,比如说类,需要在类定义中继承ICloneable接口,并实现Clone方法,这是一个固定格式,下面看一个例子 public class Test:ICloneable...

吴俊城 1602

windows11 远程桌面连接 通过代理连接RDP桌面报错 错误代码0x904 拓展错误代码0x7

打开windows Defender防火墙设置--允许应用通过防火墙更改设置--允许其他应用浏览--进入C:\WINDOWS\system32目录选择mstsc.exe进入C:\Windows\SysWOW64目录h'qmstsc.exe添加后列表里多了一个远程桌面连接,还有一个Remote Desktop Connection,配置网络权限后保存连接成功。

weixin_43978891的博客 1万+

C#变量内存拷贝

C# short类型数据拷贝给ushort类型 方法1:转成bytes数组后再转换过去 short bbb = -1000; ushort ccc = 0; byte[] srcbyte = BitConverter.GetBytes(bbb); ccc=BitConverter.ToUInt16(srcbyte,0); 方法2:直接非托管内存拷贝 ushort[] srcbyte2=new ush

arno的博客 1096

yolov11使用记录(训练自己的数据集)

本文介绍了如何安装和使用Ultralytics YOLOv11进行目标检测。首先,通过Anaconda创建并激活虚拟环境,安装必要的依赖库如PyTorch和Ultralytics。接着,从GitHub下载YOLOv11源码,并在PyCharm中配置环境。下载预训练的YOLOv11模型后,通过编写简单的Python脚本进行图片检测,验证环境配置的正确性。最后,文章提到可以基于此环境训练自定义模型。整个过程涵盖了从环境搭建到模型应用的完整流程,适合初学者快速上手YOLOv11。

IT菜鸟 7548

告别Modern Standby噩梦:Win11睡眠断网冻结的根源剖析与S3睡眠回归实战

本文深入剖析了Windows 11中Modern Standby(现代待机)模式导致睡眠后断网、系统冻结等问题的根源,指出其与硬件驱动、后台活动的兼容性矛盾。文章提供了通过修改注册表键值强制系统回归稳定S3睡眠状态的详细实战步骤,帮助用户彻底解决睡眠故障,实现可靠的远程访问与挂机任务。

weixin_29210727的博客 604

015 C# 浅度和深度复制

从一个变量到另一个变量按值复制对象,而不是按引用复制对象(即以与结构相同的方式复制)可能非常复杂。因为一个对象可能包含许多其他对象的引用,例如,字段成员等,这将涉及许多繁琐的操作。把每个成员从一个对象复制到另一个对象中可能不会成功,因为其中一些成员可能是引用类型。.NET Framework 考虑了这个问题。简单地按照成员复制对象可以通过派生于System.Object 的MemberwiseCl...

子非愚的博客 359

Unity游戏开发实战:手把手教你用C#实现一个简单的反向运动学(IK)控制器

本文详细介绍了在Unity游戏开发中如何使用C#实现一个简单的反向运动学(IK)控制器。通过建立骨骼层级结构、实现CCD算法和角度限制,开发者可以轻松创建自然的角色动画效果。文章还提供了可视化调试工具和性能优化方案,帮助提升开发效率。

weixin_42523711的博客 243

C#学习之浅拷贝与深拷贝

(针对引用类型的数据)。这个操作只是复制变量的地址,并不会创建新的对象,而是stu1和stu2两个变量指向了同一个对象。因此其中一个变量stu2的属性改变了,会影响另一个变量stu1所引用的对象。引用类型的变量将引用存储到变量中,引用类型的两个变量可以引用同一个变量。深拷贝和浅拷贝的主要差别是在对引用类型的数据的复制上,浅拷贝类似于指针,指向引用类型数据的地址,而深拷贝则是重新开辟一个内存空间用来储存引用类型的数据。在学习浅拷贝与深拷贝之前,我们需要明确值类型和引用类型这两个概念。

JinnXinn的博客 971

Altium Designer(AD)仿真实验操作指南

1:运行仿真2:设置仿真3:放置电源模块4:放置器件模块5:探针。

XU157303764的博客 8892

基于LLM【M3】驱动的自动化攻击智能体AK(受控使用)

摘要:文章实测了基于大模型的目标驱动型云攻击智能体,展示攻击者仅需输入业务目标(如"窃取BigQuery数据")即可自动完成SSRF、令牌解析、数据导出等全链条攻击。研究发现:(1)攻击编排范式已从固定脚本升级为自适应路径;(2)传统基于IOC的防御与新型攻击存在结构性错位;(3)防御需转向元数据加固、跨服务行为序列检测和AI驱动的紫队演练。实验在授权靶场使用合成数据,验证了攻击智能体"监督者模型+专业执行组"的协作模式,强调防御体系需从单点检测升级为攻击链理解能力。

云上笛暮 307

Day01-C#学习:03、变量的赋值

变量的赋值

weixin_44842255的博客 1139

数美device_fingerprint、device_id、hmac生成

device_fingerprint、hmac、device_id参数分析与解读

吴秋霖的博客 2873

C#常见技能_参数传递

大家好,我是华山自控编程朱老师前几天一个学员在学习C#与参数传递交互时,也不知道参数传递可以用来做什么。下面我们就详细讲讲C# 和参数传递交互的相关知识。C#是一种面向对象的编程语言,支持多种参数传递方式,包括传值和传引用两种方式。在本文中,我们将讨论C#中的参数传递方式以及如何使用它们来实现不同的交互模式。

hspx668的博客 982

LLC设计指南(一)第一章:别一上来就背公式,先把 LLC 的“脾气”摸清楚

很多工程师第一次学 LLC,都会有一种感觉:这个电源拓扑,好像不是在工作,而是在“跳舞”。Buck 很直观,开关一开,电感充电;开关一关,电感放电。Flyback 也好理解,先存能量,再把能量丢给副边。但 LLC 不一样。它不是硬邦邦地把能量“推过去”,而是让电感、电容、变压器一起形成一个谐振网络,让能量在里面来回摆动。控制器再通过调节开关频率,把这个摆动过程“驯服”成稳定输出。这也是 LLC 最迷人的地方:🎯。

weixin_43199439的博客 317

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 2

虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。继续上篇未完成的“参数传递对堆栈的影响”。

LeeWhoee University 3795

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C# 变量与参数详解

C# 变量与参数详解

一起coding,一起嗨。 813

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

C#中参数传递

一、参数的一般传递方式   在c#中,除非使用ref或者out前缀,所有参数都通过值来传递。变量的栈数据会完整复制到目标参数中。分为以下3种情况: 1、 引用类型的变量只包含对象所在的内存地址,将要复制的是内存地址而不是对象本身,所以对底层对象的修改会保留。如果在方法内部将内存地址指向一个新对象,    则方法结束后在方法中所作的修改会被丢弃。 class Progr

333

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第一节 理解堆与栈

简介 虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这篇文章会包含堆与栈的基础知识,变量类型,变量工作原理。

LeeWhoee University 1万+

JS 的值类型和引用类型(变量的原始值和引用值)

js 中的值类型和引用类型的不同点,及各自使用方法

weiweiliude2的专栏 1187

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第五节 引用类型复制问题及用克隆接口ICloneable修复

虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这一节我们将介绍引用类型变量在堆中存储时会产生的问题,同时介绍怎么样使用克隆接口ICloneable去修复这种问题。

LeeWhoee University 4657

关于C#函数对象参数传递的问题

   我们知道在.net里class是引用类型,在函数参数表中的对象传递的都是对象的引用,所以在函数体内对其对象参数的修改会影响函数外对应的对象本身,例如下面的程序:   class Program { static void Main(string[] args) { TestClass objA = ne

野文的专栏 2543

C#类型和变量

C# 有两种类型:值类型和引用类型。 值类型的变量直接包含数据,而引用类型的变量则存储对数据(称为“对象”)的引用。 对于引用类型,两个变量可以引用同一对象;因此,对一个变量执行的运算可能会影响另一个变量引用的对象。 借助值类型,每个变量都有自己的数据副本;因此,对一个变量执行的运算不会影响另一个变量(ref 和 out 参数变量除外)。 C# 值类型又细分为简单类型、枚举类型、结构类型和可以为 ...

weixin_42671141的博客 366

C# 中的 out 参数传递

C# 中的 out 参数是一种强大的特性,它允许方法修改参数的值并将这些更改反映到调用方。在 C# 中,out 参数是一种特殊类型的方法参数,它允许方法在返回之前修改参数的值。但是,当使用 out 参数时,方法可以修改参数的值,并且这些更改会反映到调用方。因为在离开方法之前,必须对 out 参数进行赋值,所以确保方法中对 out 参数的赋值是很重要的。最后,在命名 out 参数时应该遵循良好的命名规范,以便清晰地表达参数的用途和含义。在调用该方法时,需要使用 `out` 关键字来指示参数是输出参数。

hspx668的博客 1498

深入浅出图解C#堆与栈 C# Heap(ing) VS Stack(ing) 第四节 参数传递对堆栈的影响 1

虽然在.Net Framework 中我们不必考虑内在管理和垃圾回收(GC),但是为了优化应用程序性能我们始终需要了解内存管理和垃圾回收(GC)。另外,了解内存管理可以帮助我们理解在每一个程序中定义的每一个变量是怎样工作的。这篇文章我们将介绍一些方法参数传递行为在堆与栈中的影响。前几节我们介绍了堆与栈的基本工作原理,程序执行时值类型与引用类型在堆栈中的存储。另外,我们已经介绍了一些关于指针的基本知识。这一节中参数传递对堆栈的影响很重要,下面会慢慢道来。

LeeWhoee University 1万+

C#中ref out和params 即传值\传引用和传参的区别

C#中对于值类型的变量,进行值传递和引用传递是好理解的。但是对于C#中对于引用类型变量进行的值传递一直不是很清楚。尽管有测试过C#对于引用类型变量进行值传递和引用传递的例子,结果当然是不同的。不过具体原理怎么也想不清楚。今天在网上看了一些资料,总算是弄明白了。 归结起来,call-by-value方式的调用参数和被调用方法中的参数,是两个变量,代表两个不同的内存地址;而call-by-refer

我为编程狂,我为外语狂 5664
上一篇: outlook2007新邮件来时右下角出现类似于qq,msn的提示
下一篇: 我理解c#(二) :索引器
十八道胡同
博客等级 码龄20年 848粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值