首页 编程语言 C#中数组作为参数传递的问题

C#中数组作为参数传递的问题

原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这个数据的调用者不会改变其值。

如果参数在使用过程中被意外修改,将会带来不可预知的结果,而且这种错误很难被检查到,所以我们在设计方法参数的时候,要充分考虑传递引用类型参数或者引用方式传递引用类型参数可能带来的后果。

如果一个数据在传递过程中不能被改变,就要在构建这个对象的时候就使其值(字段或属性)不被改变。


一、对于简单的参数的控制

1、值类型参数传递

这种情况因为传递的是参数的副本,不影响原始值,不需要控制。

2、引用类型参数传递

a、由值类型组成的数据结构

需要将字段设置为只读,属性只有get。赋值只能通过构造方法进行。

b、包含引用类型字段的数据结构

这种情况是递归的,需要保证字段为readonly,属性为get的同时,引用类型字段所使用类型也满足该要求。

public class SuperClass{    

private readonly int  _no;   

private readonly SubClass _tag;    

public int NO {        

get{ return _no;}    

}    

public SubClass Tag    

{        get{ retirn _tag;}    }    

public SuperClass(int no,SubClass tag)   

 {        _no=no;        _tag=tag;       }}

public class SubClass{    

private readonly int _field;   

public int Field    {        get{ return _field;}    }   

public SubClass(int field)    {        _field=field;    }}


二、对于复杂引用类型参数传递的控制

所谓复杂,是参数是数组或集合类型,或者参数包含这些类型数据,这种情况下上面的方法不能保证参数数据不被修改,因为即使对象为只读的,但是对象中的数组或集合字段(属性)还是可以修改的。

1、集合参数(包含集合字段的引用参数也一样)

.net 4.5以前版本可以使用不包含修改集合元素方法的接口来代替具体集合类型。例如使用IEnumerable接口代替List。4.5版本可以直接使用IReadOnlyCollection接口或实现该接口的集合类型。

2、数组参数

没有好的办法保护数组类型参数不被修改,所以尽量避免使用数组类型作为方法参数,除非用到可选参数时候。


三、理解上面的东西需要区分清楚一下概念的区别

  • 1、值类型和引用类型的区别
  • 2、值传递和引用传递(ref和out)的区别
  • 3、传递引用类型参数和引用传递(ref和out)引用类型参数的区别 [这一点最容易混淆]

区别在于使用该参数过程中为该引用新建了对象的情况下,前者不影响原始值,后者影响原始值,示例:

void FunA(MyClass a){     a=new MyClass("A");}

void FunB(ref MyClass a){    a=new MyClass("B");}

void Test(){    MyClass a=new MyClass("A");     

FunA(a);    Print(a);              //a还是原始的对象 TEST    

FunB(ref a);    Print(a);               //a变为新对象   B}

记住一条原则:值类型传递的是值的副本,引用类型传递的是对象引用,所以值参数的修改不影响原始值,引用类型的修改影响原始值;值传递的参数构建不影响原始值,引用传递(ref和out)影响原始值。


声明 本站内容部分来源于网络,仅供参考学习交流并不代表本站观念,如无意中侵犯您的权益( 包括/图片/视频/个人隐私等信息 )请来信告知,本站收到信息会尽快处理并回访,联系邮箱:laodilailiao@foxmail.com

站心网

原则:尽可能控制对数据的修改,如果可以预测某个数据不会或不应该被改变,就要对其控制,而不要期望使用这..

为您推荐

轻松学习 JavaScript函数中的默认参数

JavaScript函数可以有默认参数值。通过默认函数参数,你可以初始化带有默认值的正式参数。如果不初始化具有某些值的参数,则该参数的默认值为undefined。请看下列代码:function foo(num1){console.log(num1);}foo()..

JS 中彻底删除 JSON 对象组成的数组中的元素

在 JS 中,对于某个由 JSON 对象组成的数组,例如:var test = [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b": "6" }];如果我们想要删除其中的第二个json对象,应该怎么做呢?其实方法和操作数..

JS获取url参数

以下JS函数用于获取url参数:functiongetQueryVariable(variable){varquery=window.location.search.substring(1);varvars=query.split("&");for(vari=0;i<vars.length;i++){varpair=vars[i].split("=");if(pair[0]==..

javascript 6种连接数组的方法和对比

在 JavaScript 中,有多种方法可以用来连接数组,以下是常见的几种:1. concat() 方法用于连接两个或多个数组,返回一个新的数组,不修改原数组。const arr1 = [1, 2, 3];const arr2 = [4, 5, 6];const result = arr..

js 数组方法 - 修改篇

js数组方法可分为三类:修改、访问、迭代。修改:改变原有数组访问:不改变原有数组,从原有数组中获取数据迭代:对数组的每一项进行处理,返回数据本文主要介绍数组的修改篇一、增加1、push()含义:在数组末尾添加..

什么是...rest?收集剩余参数

在 JavaScript 中,...rest 参数是一种特殊的语法,用于收集函数定义中所有剩余的参数,并将它们作为一个数组传递给函数。换句话说,它可以将不定数量的参数打包成一个数组。语法:function myFunction(...args) {//..

c#获取两个数组或集合的交集或差集

c#获取两个数组或集合的交集或差集。 不要使用循环,效率肯定低。C#有现成的高性能的获取数组或集合的交集或差集方法:Intersect和Except。 使用Intersect和Except获取两个数组的交集或者差集时性能很高,我测试两个..

Blazor获取Url路由参数的方法

这里整理了两种获取参数值的方法: 通过NavigationManager服务获取参数值和配置路由参数获取参数值。在Blazor Server和WebAssembly中,可以通过注入 NavigationManager服务获取Uri转化为Uri对象得到Query. 然后使用H..

MiniAPI参数绑定 服务注入 响应输出使用示例

在VS2022中可以使用MiniAPI。 使用MiniAPI以创建具有最小依赖项的 HTTP API。 它们非常适合于需要在 ASP.NET Core 中仅包括最少文件、功能和依赖项的微服务和应用。MiniAPI创建方法启动 Visual Studio 2022 并选择“..

React路径不变location.search参数改变不触发useEffect

React项目里有两个菜单项会到同一个pathname但是参数不同,这两个页面切换时不会触发页面数据刷新(切换url页面代码不会重新执行)。原来的做法是用window.location.search获取参数,在别的地方都没有问题,这里比较..

React获取url参数的几种方法

在React中获取URL参数的方法有以下几种:使用window.location.searchconst searchParams = new URLSearchParams(window.location.search);const id = searchParams.get('id');使用react-router-dom如果使用了react-r..

C#中结构体和byte数组之间的转换

前言在使用C#写通信的程序时,数据只能以byte数组的进行传输,处理起来比较麻烦不说,如果与非托管语言的API交互时,很多的都是传送结构体,在C/C++语言中可以很方便的把一个char[]数组或者内存空间转换为一个结构体..

react hooks获取url参数

在 React 中使用 Hooks 来获取 URL 参数可以通过使用 React Router 库来实现。React Router 是一个流行的用于处理路由的库,它允许你在应用中管理不同的页面和路由。以下是如何使用 React Router 和 Hooks 来获取 UR..

Nginx配置文件(nginx.conf)配置参数详解

Nginx的配置文件nginx.conf配置参数非常多,做网站配置或维护难免需要修改nginx的配置文件,以下针对配置文件中的各种配置参数做出详细的解释,供参考。user nginx nginx ; #Nginx用户及组:用户 组。window下不指定..

react获取url参数 忽略参数名大小写

要在 React 中获取 URL 参数并忽略参数名的大小写,你可以使用 JavaScript 的 URLSearchParams 对象来处理 URL 查询参数。这将允许你在参数名上执行不区分大小写的比较。以下是一个示例:import { useEffect } from ..

C#使用ToString方法数组类型格式化为字符串

在C#中,很多数值类型的转换为字符串时都会使用到ToString方法,不同的数据类型可以使用一些常见的格式化输出,可以转换为指定的格式,以下总结一下各个基础结构对象的格式化。xxx.ToString(format):格式字符串采用..

react获取url参数不区分大小写

在React中,获取URL参数可以使用window.location.search属性来获取查询字符串,然后使用JavaScript的方法来解析它。要实现不区分大小写的参数获取,你可以先将查询字符串转换为小写,然后再进行匹配。以下是一个示例..

最大开源社区Hugging Face发布HuggingChat 有300亿参数

ChatGPT的平替真来了!最大开源社区Hugging Face发布了HuggingChat,有300亿参数。HuggingChat既开源,还免费,互联网上随随便便就能用。HuggingChat官网:hf.co/chat,秒秒钟体验ChatGPT完美平替。如果说,ChatGPT..

Windows/Linux C语言如何实现可变参数的函数

前言在Windows/Linux中,C语言是可以实现可变参数的函数的,使用va_list系列宏,在C中可以定义可变参数列表,包含可变参数信息,从而实现函数的可变参数。va_list系列宏va_list系列宏,常用的宏包含:va_start(ap, l..

js filter、map、reduce等遍历数组的方法

JavaScript中遍历数组的方法有很多种,其中最常用的有以下几种:1. for 循环const array = [1, 2, 3, 4, 5];for (let i = 0; i < array.length; i++) {console.log(array[i]);}2. forEach() 方法const array = [1, 2..

发表回复

返回顶部