C#中传递结构数组给ref int类型,该怎么传

C#中传递结构数组给ref int类型,该怎么传,第1张

不加ref 时 为什么传值不对源地址数改变,而传数组发生了改变呢? 传值:复制一个新值传递到函数,无论新值怎么改,原来的值永远不会变。 传引用:把原来的值的地址传递到函数,就是在原来的值上直接更改。

调用Com可以直接用添加引用的方式,系统就会自动生成一个InterOP的dll,然后按照C#dll的方式调用即可,如果你调用DLL的导出函数,那么通常应该尽量的将参数简化。 比如这里C++定义应该按照int的方式定义,C#按照IntPtr的方式定义。

C#中有三个关键字 ref out params 虽然本人不喜欢这三个关键字 因为它们疑似破坏面向对象特性 但是既然m$把融入在c#体系中 那么我们就来认识一下参数修饰符ref out params吧 还有它们的区别

NO params

一个可以让方法(函数)的拥有可变参数的关键字

原则 在方法声明中的 params 关键字之后不允许任何其他参数 并且在方法声明中只允许一个 params 关键字

示例(拷贝到vs 中即可用 下面不再说明)

public partial class Form : Form {public static void UseParams(params int[] list) {string temp = ; for (int i = ; i < list Length; i++)temp = temp + +list[i] ToString(); MessageBox Show(temp); }public static void UseParams (params object[] list) {string temp = ; for (int i = ; i < list Length; i++)temp = temp + + list[i] ToString(); MessageBox Show(temp); } public Form () {InitializeComponent(); }private void button _Click(object sender EventArgs e) {UseParams( ); //看参数是 个UseParams( ); //看参数是 个 可变吧UseParams ( a test ); int[] myarray = new int[ ] { }; UseParams(myarray); //看也可以是容器类 可变吧 )}}

NO out

这是一个引用传递L

原则一 当一个方法(函数)在使用out作为参数时 在方法中(函数)对out参数所做的任何更改都将反映在该变量中

原则二 当希望方法返回多个值时 声明 out 方法非常有用 使用 out 参数的方法仍然可以返回一个值 一个方法可以有一个以上的 out 参数

原则三 若要使用 out 参数 必须将参数作为 out 参数显式传递到方法 out 参数的值不会传递到 out 参数

原则四 不必初始化作为 out 参数传递的变量 因为out 参数在进入方法(函数)时后清空自己 使自己变成一个干净的参数 也因为这个原因必须在方法返回之前为 out 参数赋值(只有地址没有值的参数是不能被 net接受的)

原则五 属性不是变量 不能作为 out 参数传递

原则六 如果两个方法的声明仅在 out 的使用方面不同 则会发生重载 不过 无法定义仅在 ref 和 out 方面不同的重载 例如 以下重载声明是有效的

class MyClass { public void MyMethod(int i) {i = ; } public void MyMethod(out int i) {i = ; } } 而以下重载声明是无效的 class MyClass { public void MyMethod(out int i) {i = ; } public void MyMethod(ref int i) {i = ; } }

有关传递数组的信息 请参见使用 ref 和 out 传递数组

NO ref

ref仅仅是一个地址!!!

原则一 当一个方法(函数)在使用ref作为参数时 在方法中(函数)对ref参数所做的任何更改都将反映在该变量中

原则二 调用方法时 在方法中对参数所做的任何更改都将反映在该变量中

原则三 若要使用 ref 参数 必须将参数作为 ref 参数显式传递到方法 ref 参数的值可以被传递到 ref 参数

原则四 ref参数传递的变量必须初始化 因为ref参数在进入方法(函数)时后还是它自己 它这个地址指向的还是原来的值 也因为这个原因ref参数也可以在使用它的方法内部不 *** 作

原则六 如果两种方法的声明仅在它们对 ref 的使用方面不同 则将出现重载 但是 无法定义仅在 ref 和 out 方面不同的重载 例如 以下重载声明是有效的

class MyClass { public void MyMethod(int i) {i = ; } public void MyMethod(ref int i) {i = ; } } 但以下重载声明是无效的 class MyClass { public void MyMethod(out int i) {i = ; } public void MyMethod(ref int i) {i = ; } }

有关传递数组的信息 请参见使用 ref 和 out 传递数组

示例

public static string TestOut(out string i) {i = out b ; return return value ; }public static void TestRef(ref string i) {//改变参数i = ref b ; }public static void TestNoRef(string refi) {// 不用改变任何东西 这个太明显了refi = on c ; } public Form () {InitializeComponent(); }private void button _Click(object sender EventArgs e) {string outi; //不需要初始化MessageBox Show(TestOut(out outi)); //返回值//输出 return value ; MessageBox Show(outi); //调用后的out参数//输出 out b ; string refi = a ; // 必须初始化TestRef(ref refi); // 调用参数MessageBox Show(refi); //输出 ref b ; TestNoRef(refi); //不使用refMessageBox Show(refi); //输出 ref b ; }

lishixinzhi/Article/program/net/201311/12015

回答主要是因为看到你的分数比较多。。。所以写了个实例给你。没多少好讲的,和C语言的指针类似。如果不加ref,函数参数传递的时候是把值赋值一份,函数内部的 *** 作不会影响外部。加了ref就是和外部是一个值。

        static void Main(string[] args)
        {
            int a = 2;
            int b = 3;
            ConsoleWriteLine("a={0},b={1}", a, b);
            Swap(ref a, ref b);// 2, 3
            ConsoleWriteLine("a={0},b={1}", a, b);
            ConsoleReadLine();// 3, 2
        }
        static void Swap(ref int a, ref int b)
        {
            int c = a;
            a = b;
            b = c;
        }

返回Number(一个数)在Ref(一组数字)中排序的序号。order为零或省略按从大到小排,否则按从小到大排序

Number    为需要找到排位的数字。

Ref    为数字列表数组或对数字列表的引用。Ref 中的非数值型参数将被忽略。

Order    为一数字,指明排位的方式。

如果 order 为 0(零)或省略,Microsoft Excel 对数字的排位是基于 ref 为按照降序排列的列表。 
如果 order 不为零,Microsoft Excel 对数字的排位是基于 ref 为按照升序排列的列表。 

new TestMultiArray()Test();
----------------
public class TestMultiArray
{
public void Test()
{
//定义2维数组
int[,] ma = new int[4, 2];
ma[0, 0] = 3;
ma[0, 1] = 34; //第1行结束
ma[1, 0] = 1;
ma[1, 1] = 8;//第2行结束
ma[2, 0] = 898;
ma[2, 1] = 83;//第3行结束
ma[3, 0] = 352;
ma[3, 1] = 19;//第4行结束
//将2维数组转换为1维数组
int[] asm = new int[maLength]; //maLength=2维数组数量
//转换过程
int t = 0;
for (int i = 0; i < 4; i++)
{
for (int s = 0; s < 2; s++)
{
asm[t] = ma[i, s];
t++; //计算器
}
}
ArraySort(asm); //排序
//输出显示
foreach (int z in asm)
ConsoleWriteLine(zToString());
}
}
最小的数是asm[0];


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12609232.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存