C#知识拾遗

时间:2023-03-09 01:29:52
C#知识拾遗

参数验证方式

1.    一般方法

1.1 手动验证

最为普遍常见,略。

1.2 使用扩展方法验证

在C#3.0 中,引入了扩展方法,可以以一种更优雅的方式来进行参数验证,如:

 //参数辅助类
public static class ArgumentHelper
{
public static void RequireRange(this int value, int minValue, int maxValue, string argumentName)
{
if (value > maxValue || value < minValue)
{
throw new ArgumentException(string.Format("The value must be between {0} and {1}", minValue, maxValue), argumentName);
}
} public static void RequireNotNullOrEmpty(this string value, string argumentName)
{
if (string.IsNullOrEmpty(value))
{
throw new ArgumentException("The value can't be null or empty", argumentName);
}
}
} //用户注册
public bool Register(string name, int age)
{
name.RequireNotNullOrEmpty("name");
age.RequireRange(,,"age");
//insert into db
}

2. 使用类型或框架

使用类库

FluentValidationCuttingEdge.ConditionsEnterprise Liberary(Validation Application Block组件),Code Contracts(.NET 4.0正式引用)等。

2.2 使用框架

如ASP.NET MVC的Model中数据标记(Data Annotations) 属性。

参考资料:C# 中参数验证方式的演变

 

全角与半角字符转换

全角空格为12288,半角空格为32,其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248。基于此便不难实现他们之间的转换:

         /// <summary>
///转全角的函数(SBC case)
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
/// </summary>
/// <param name="input">输入</param>
/// <returns></returns>
public static String ToSBC(String input)
{
char[] c = input.ToCharArray(); for (int i = ; i < c.Length; i++)
{
if (c[i] == )
{
c[i] = (char); continue;
} if (c[i] < ) c[i] = (char)(c[i] + );
} return new String(c);
} /// <summary>
///转半角的函数(DBC case)
///全角空格为12288,半角空格为32
///其他字符半角(33-126)与全角(65281-65374)的对应关系是:均相差65248
/// </summary>
/// <param name="input"></param>
/// <returns></returns>
public static String ToDBC(String input)
{
char[] c = input.ToCharArray(); for (int i = ; i < c.Length; i++)
{
if (c[i] == )
{
c[i] = (char);
continue;
} if (c[i] > && c[i] < ) c[i] = (char)(c[i] - );
} return new String(c);
}

参考资料:C#全角和半角转换

转string时,null的处理:

Convert.ToString能处理字符串为null的情况。ToString方法不能处理字符串为null的情况,会抛出异常。

string/byte[]/MemoryStream/Base64String的相互转换

关系如下图:

C#知识拾遗

1.字符串转比特数组

(1)byte[] bt=System.Text.Encoding.Default.GetBytes("字符串");

(2)byte[] bt=Convert.FromBase64String("字符串");

2.字符串转流

(1)MemoryStream ms=new MemoryStream(System.Text.Encoding.Default.GetBytes("字符串"));

(2)MemoryStream ms=new MemoryStream(Convert.FromBase64String("字符串"));

3.流转比特数组

(1)byte[] bt=ms.ToArray();

(2)MemoryStream ms=new MemoryStream();ms.Write(bt,0,ms.Length);

4.流转字符串

(1)string str=Convert.ToBase64String(ms.ToArray());

(2)string str=System.Text.Encoding.Default.GetString(ms.ToArray());

5.比特数组转字符串

(1)string str=System.Text.Encoding.Default.GetString(bt);

(2)string str=Convert.ToBase64String(bt);

6.比特数组转流

(1)MemoryStream ms=new MemoryStream(bt);

(2)MemoryStream ms=new MemoryStream();ms.Read(bt,0,bt.Lenght);

参考资料:字符串string 、byte[]、MemoryStream、Base64String的相互转换

c# 反射Invoke调用方法获得out带出的值

输出参数在最后,基于些获取方法如下:

             var msg = string.Empty;
object[] parameters = new object[] { model, null }; //函数签名为public bool Update(DB_BedInfo model, out string mess);
updateMethod.Invoke(serviceObj, parameters); //parameters[1]即为out带出的值
msg = Convert.ToString(parameters[]);

具名参数和可选参数

  具名参数 和 可选参数 是 C#  4.0 出来的新特性。当有多个可选参数,前面的可选参数不想传时,可使用具名参数解决。