C# 方法里面的默认参数

今天在写代码的时候,忽然想到有种情况可以适用方法的默认参数的情况,就是别人写的方法(已经很多地方用了,你现在想加个参数,又不用去改原来引用的代码)。当然你可以写个方法的重载,我也曾经想写重装来加上这个参数条件。因为重载已经会用了,所以就学习了下方法参数缺省的情况。

我也看了园子里面大内老A写的那篇文章,讲得很好。但是我他说的那些,可以作为入门,但是并不能当成准则来对待。

上面这种写法并没有啥毛病,但是如果方法是从模块的外部调用,更改参数的默认值具有潜在的危险性,call site在调用的嵌入了默认值,如果你以后更改了参数的默认值,但没有重新编译call site里面的所在代码,它在调用你方法的时候,依然会传递旧的默认值,所以可以考虑将0/null 作为哨兵的值使用,从而指出默认行为,这样一来,即使更改了默认值,也不必要重新编译包含了call site的全部代码。

    

       //第一种做法
        static void TestMethod(string foo,string bar="bar123") {
            Console.WriteLine($"{foo}{bar}");
        }
            //第二种做法
        static void TestDefaultMethod(string foo,string bar = null) {
            bar = bar ?? "bar123";
            Console.WriteLine($"{foo}{bar}");
        }        推荐使用下面这种做法

上面这个是最重要的,如果你想着啥时候用缺省参数和函数重载,请根据情况来定吧 。

   在C#中,一旦为某个参数分配了一个默认值,编译器就会向内部该参数应用定制一个attribute 即是(OptionalAttribute)这个attribute会在最终生产的文件的元数据类型持久性的存储下来,除此之外,编译器会向参数应用一个DefaultParameterValueAttribue,也会将这个特性持久性存储在最终文件的元数据里面。

时间: 2024-08-05 06:56:15

C# 方法里面的默认参数的相关文章

python 函数默认参数的小坑

默认参数和可变对象 在执行def语句时,默认参数的值只被解析并保存一次,而不是每次在调用函数的时候.这通常是你想要的那样,但是因为默认值需要在每次调用时都保持同样对象,你在试图改变可变的默认值(mutable defaults)的时候可要小心了.例如,下面的函数中使用一个空的列表作为默认值,然后在之后每一次函数调用的时候改变它的值: 1 2 3 4 5 6 7 8 9 10 11 12 >>> def saver(x=[]):   # 保存一个列表对象 ...     x.append(

Java函数(方法)的默认值问题

Java不能为函数(方法)设置默认参数. 原因是“默认参数”和“方法重载”同时支持的话有二义性的问题,但使用“方法重载”可以间接地实现”默认参数“的效果,例如: public class A{ public void doA(int a){ } public void doA(){ this.doA(0);//这里默认传入0,可以近似认为通过重载实现了默认值的设置 } } 参考: 1)java 能为方法参数设置默认参数吗 原文地址:https://www.cnblogs.com/GjqDream

[Python] partial改变方法默认参数

Python 标准库中 functools库中有很多对方法很有有操作的封装,partial Objects就是其中之一,他是对方法参数默认值的修改. 下面就看下简单的应用测试. #!/usr/bin/env python # -*- coding: utf-8 -*- #python2.7x #partial.py #authror: orangleliu ''' functools 中Partial可以用来改变一个方法默认参数 1 改变原有默认值参数的默认值 2 给原来没有默认值的参数增加默认

C# 方法中带默认值的参数

设计一个方法的参数时,可为部分或全部参数分配默认值.然后,调用这些方法的代码可以选择不指定部分实参,接受其默认值.除此之外,调用方法时,还可通过指定参数名称的方式为其传递实参.以下代码演示了可选参数和命名参数的用法: using System; using System.Collections.Generic; using System.Text; namespace ParameterInMethod { class Program { private static int s_n = 0;

JVM的默认参数

如果在META-INF/MANIFEST.MF文件里面设置了Main-Class属性,那么你就可以很方便的通过java -classpath myapp.jar Main命令甚至更简洁的java -jar myapp.jar命令,来启动java虚拟机.这些命令会使用默认的设置来启动JVM. 要想看到JVM执行时使用在使用哪些参数以及其各参数默认值,可以使用这个命令: java -XX:+PrintFlagsFinal -version 1 2 3 4 5 6 7 8 9 10 11 12 13

C++:构造函数的默认参数知识拓展

和普通函数一样,构造函数中参数的值既可以通过实参传递,也可以指定为某些默认值,即如果用户不指定实参值,编译系统就使形参取默认值. 例9.3的问题也可以使用包含默认参数的构造函数来处理. [例9.4]将例9.3程序中的构造函数改用含默认值的参数,长.宽.高的默认值均为10. #include <iostream> using namespace std; class Box { public : Box(int h=10,int w=10,int len=10); //在声明构造函数时指定默认参

C# 默认参数/可选参数需要注意

在使用C#的默认参数/可选参数的时候,需要注意,参数的默认值是在编译的时候,自动加入调用方的. 如我有这样一个方法: 1 public class Name 2 { 3 public void Test(Boolean isPass, String name = "") 4 { 5 if (String.IsNullOrWhiteSpace(name)) 6 Console.WriteLine("name is empty."); 7 else 8 Console.

C++函数:默认参数的函数

1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops); //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return; for(int i=0;i<loops,i++); } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但有时需要用相同的实参反复调用delay()函数.C++可以给参数定义默认值.如果将delay(

c++有默认参数的函数---4

原创博客:转载请标明出处:http://www.cnblogs.com/zxouxuewei/ 1.默认参数的目的 C++可以给函数定义默认参数值.通常,调用函数时,要为函数的每个参数给定对应的实参.例如: void delay(int loops): //函数声明 void delay(int loops) //函数定义 { if(100ps==0) return: for(int i=0;i<loops,i++): } 无论何时调用delay()函数,都必须给loops传一个值以确定时间.但