zoukankan      html  css  js  c++  java
  • 函数----Beginning Visual C#

    更多相关文章,见本人的个人主页:zhongxiewei.com

    当函数传递参数通过引用方式传递的时候,语法有所不同

    // in cpp
    void doubleVal(int &val) {
        // ...
    }
    
    int main() {
        int val = 20;
        doubleVal(val);
        cout << val << endl; // output: 40
    }
    // in c sharp
    static void doubleVal(ref int val) // 使用ref进行标识
    {
        val *= 2;    
    }
    
    static void Main(string[] args)
    {
        int val = 20;
        doubleVal(ref val);
        Console.WriteLine(val); // output: 40
    }

    out 关键字,在c++中没有相似的关键字或用法 out 关键字的使用方式和ref类似,但有两点不同,1)在使用ref参数的时候,传递没有赋值的参数是不合法的。无法通过编译。但是在使用out参数的时候是合法的。2)并且使用out参数的时候,该参数被当作没有赋值的,对该值的调用会发生编译错误。如下:

    static void doubleVal(out int val)
    {
        val *= 2;   // 想要使用val中的数值,
                    // 但是val被认为是没有赋值的,因此出现编译错误 
    }
    
    static void Main(string[] args)
    {
        int val=3;
        doubleVal(out val);
        Console.WriteLine(val); // output: 40
    }

    对于不定量参数输入的关键字为:param,具体实现如下:

    static int sum(param int[] num) // 这里需要注意的是,param参数必须在参数列表的最后的位置
    {
        int sumVal = 0;
        foreach (int n in num)
        {
            sum += n;
        }
        return sum;
    }

    在c#中对变量作用域的检测更加的严格,比如类似下面的代码能够在c++中编译通过并成功运行,而在c#中则无法通过编译,由于在同一个作用域中调用了没有初始化的变量。

    string text;
    for (int i=0; i<1; i++)
    {
        text = "hello";
    }
    Console.WriteLine(text); // in cpp: cout << text << endl;

    函数重载和c++中的类似,但是由于c#中对于“引用”,引入了ref关键字,因此,对于引用参数和非引用的参数的函数在c#中也能够重载,这在c++中是不合理的。如:

    // in c#
    static void showDouble(ref int val) {}
    static void showDouble(int val) {}
    
    // in cpp is error
    void showDouble(int &val) {}
    void showDouble(int val) {}

    在c#中关于函数,还有delegate关键字,该关键字的含义用来创建一个能够用来表示其他函数的东东。这有点像c中的指针函数。如:

    // in c#
    delegate double processDelegate(double param1, double param2);
    static double Multiply(double param1, double param2)
    {
        return param1 * param2;
    }
    
    static double Divide(double param1, double param2)
    {
        return param1 / param2;
    }
    
    static void Main(string[] args)
    {
        processDelegate process;
        process = new processDelegate(Multiply);
        Console.WriteLine("{0}", process(3, 4));
        process = new processDelegate(Divide);
        Console.WriteLine("{0}", process(3, 4));
    }
    // in cpp
    #include <iostream>
    
    using namespace std;
    
    int multi(int a, int b) {
        return a * b;
    }
    
    int add(int a, int b) {
        return a + b;
    }
    int main() {
        int (*fn)(int,int);
        
        fn = multi;
        cout << "multi " << fn(2,3) << endl;
        fn = add;
        cout << "add " << add(2,3) << endl;
    }
  • 相关阅读:
    C++ Primer注意事项11_运算符重载_算术/关系运算符_下标运算符
    android最新的工具DateHelper
    ssh否password登陆server
    atitit.设计模式(2) -----查询方式/ command 总结
    采用Eclipse中间Maven构建Web项目错误(一)
    dm8148 jpeg编解码器测试
    C++ 结构体和类的区别
    C++ const
    C++中的inline函数
    C++ 模板类demo
  • 原文地址:https://www.cnblogs.com/grass-and-moon/p/4050867.html
Copyright © 2011-2022 走看看