C# 方法-参数

作者:vkvi 来源:千一网络(原创) 日期:2007-7-9

C# 方法参数的基本结构为:

方法名称(参数类型 参数值[, 参数类型 参数值...])

输入参数

C# 中方法参数无默认值,可以用重载代替默认值功能。

无修饰符的情况下,参数值始终按值传递,不论传递的参数类型是值类型还是引用类型,而 VB 中默认情况下是按引用传递。

也就是说方法对参数值的修改不会影响到方法之外的变量。

质疑:既然是按值传递,为什么我在传递一个对象时,对该对象的修改影响到了外部的对象?

强调一遍,不论是值类型还是引用类型,默认都是按值传递的。对于引用类型,传递时,复制的是引用地址,并不是复制的引用地址的数据,所以方法体内对引用地址数据的修改影响到了方法外的地址数据。

string 是个特例,尽管是引用类型,仍按值类型的形式传递。

引用参数

我们可以通过方法返回值,有时需要返回多个值时,利用引用参数较为方便。

引用参数如同其它语言中的输入输出参数,调用者必须初始化变量。

void Foo(ref int v)
{
    v = 3;
}
void Page_Load(object sender, EventArgs e)
{
    int n = 0;
    Foo(ref n);
    lb.Text = n.ToString();
}

显示的结果是 3,而不是 0。

注意,调用时 ref 不可少。

输出参数

输出参数功能和引用参数相同,但调用者可以不初始化变量。尽管二者功能相同,也不要混用。

  • 引用参数侧重于输入输出,输出参数只能用于输出;
  • 引用参数可以不改变参数值,输出参数必须在方法体中为其赋值。
void CreateStr(out string str)
{
    str = "new";
}
void Page_Load(object sender, EventArgs e)
{
    string str;
    CreateStr(out str);
    lb.Text = str;
}

注意,调用时 out 不可少。

尽管 ref 和 out 意义不同,当两方法仅存在 ref 和 out 差别时,将无法实现重载,如下示例将发生错误:

void Foo(ref int n)
{
    //
}
void Foo(out int n)
{
    n = 3;
}

而下列可以重载:

void Foo(int n)
{
    //
}
void Foo(ref int n)
{
    //
}

下列也可以重载:

void Foo(int n)
{
    //
}
void Foo(out int n)
{
    n = 3;
}
相关文章
文章评论
  • 1 楼:评论
    输入参数

    C# 中方法参数无默认值,可以用重载代替默认值功能。

    无修饰符的情况下,参数值始终按值传递,不论传递的参数类型是值类型还是引用类型,而 VB 中默认情况下是按引用传递。

    也就是说方法对参数值的修改不会影响到方法之外的变量。

    质疑:既然是按值传递,为什么我在传递一个对象时,对该对象的修改影响到了外部的对象?

    强调一遍,不论是值类型还是引用类型,默认都是按值传递的。对于引用类型,传递时,复制的是引用地址,并不是复制的引用地址的数据,所以方法体内对引用地址数据的修改影响到了方法外的地址数据。

    string 是个特例,尽管是引用类型,仍按值类型的形式传递。

    引用参数

    我们可以通过方法返回值,有时需要返回多个值时,利用引用参数较为方便。

    引用参数如同其它语言中的输入输出参数,调用者必须初始化变量。

    void Foo(ref int v)
    {
        v = 3;
    }
    void Page_Load(object sender, EventArgs e)
    {
        int n = 0;
        Foo(ref n);
        lb.Text = n.ToString();
    }
    显示的结果是 3,而不是 0。

    注意,调用时 ref 不可少。

    输出参数

    输出参数功能和引用参数相同,但调用者可以不初始化变量。尽管二者功能相同,也不要混用。

    引用参数侧重于输入输出,输出参数只能用于输出;
    引用参数可以不改变参数值,输出参数必须在方法体中为其赋值。
    void CreateStr(out string str)
    {
        str = "new";
    }
    void Page_Load(object sender, EventArgs e)
    {
        string str;
        CreateStr(out str);
        lb.Text = str;
    }
    注意,调用时 out 不可少。

    尽管 ref 和 out 意义不同,当两方法仅存在 ref 和 out 差别时,将无法实现重载,如下示例将发生错误:

    void Foo(ref int n)
    {
        //
    }
    void Foo(out int n)
    {
        n = 3;
    }
    而下列可以重载:

    void Foo(int n)
    {
        //
    }
    void Foo(ref int n)
    {
        //
    }
    下列也可以重载:

    void Foo(int n)
    {
        //
    }
    void Foo(out int n)
    {
        n = 3;
    }
  • 2 楼:评论
    输入参数

    C# 中方法参数无默认值,可以用重载代替默认值功能。

    无修饰符的情况下,参数值始终按值传递,不论传递的参数类型是值类型还是引用类型,而 VB 中默认情况下是按引用传递。

    也就是说方法对参数值的修改不会影响到方法之外的变量。

    质疑:既然是按值传递,为什么我在传递一个对象时,对该对象的修改影响到了外部的对象?

    强调一遍,不论是值类型还是引用类型,默认都是按值传递的。对于引用类型,传递时,复制的是引用地址,并不是复制的引用地址的数据,所以方法体内对引用地址数据的修改影响到了方法外的地址数据。

    string 是个特例,尽管是引用类型,仍按值类型的形式传递。

    引用参数

    我们可以通过方法返回值,有时需要返回多个值时,利用引用参数较为方便。

    引用参数如同其它语言中的输入输出参数,调用者必须初始化变量。

    void Foo(ref int v)
    {
        v = 3;
    }
    void Page_Load(object sender, EventArgs e)
    {
        int n = 0;
        Foo(ref n);
        lb.Text = n.ToString();
    }
    显示的结果是 3,而不是 0。

    注意,调用时 ref 不可少。

    输出参数

    输出参数功能和引用参数相同,但调用者可以不初始化变量。尽管二者功能相同,也不要混用。

    引用参数侧重于输入输出,输出参数只能用于输出;
    引用参数可以不改变参数值,输出参数必须在方法体中为其赋值。
    void CreateStr(out string str)
    {
        str = "new";
    }
    void Page_Load(object sender, EventArgs e)
    {
        string str;
        CreateStr(out str);
        lb.Text = str;
    }
    注意,调用时 out 不可少。

    尽管 ref 和 out 意义不同,当两方法仅存在 ref 和 out 差别时,将无法实现重载,如下示例将发生错误:

    void Foo(ref int n)
    {
        //
    }
    void Foo(out int n)
    {
        n = 3;
    }
    而下列可以重载:

    void Foo(int n)
    {
        //
    }
    void Foo(ref int n)
    {
        //
    }
    下列也可以重载:

    void Foo(int n)
    {
        //
    }
    void Foo(out int n)
    {
        n = 3;
    }