//
Path.GetInvalidFileNameChars()
Path.GetInvalidPathChars()
注意上面的两个方法在不同的平台上表现存在不一致的输出。
Path.GetInvalidFileNameChars() | Path.GetInvalidPathChars() | |
---|---|---|
Windows | 总共41个字符 ascii: 0-31 34 " 60 < 62 > 124 | 58 : 42 * 63 ? 92 \ 47 / | 总共36个字符 ascii : 0-31, 34 ", 60 <, 62 >, 124 |
Linux(Android) | 2个字符 ascii:0 47 / | 1个字符 ascii:0 |
/
在C#的浮点数计算中,0除以0将得到NaN,正数除以0将得到PositiveInfinity,负数除以0将得到NegativeInfinity。C#中浮点数运算从不引发异常。
double a = 0 / 0d;
if (double.IsNaN(a)){
//此处判断a为NaN
}
Double.NaN 字段
Double.NaN字段表示不是数字 (NaN) 的值。 此字段为常数。
下面的代码示例演示 NaN 的用法:
Double zero = 0;
// This condition will return false.
if ((0 / zero) == Double.NaN)
Console.WriteLine("0 / 0 can be tested with Double.NaN.");
else
Console.WriteLine("0 / 0 cannot be tested with Double.NaN; use Double.IsNan() instead.");
2<<3 010 变成010000
010000 >> 3 2
字符串拼接+和concat的区别
-
+可以是字符串或者数字及其他基本类型数据,而concat只能接收字符串。
-
+左右可以为null,concat为会空指针。
-
如果拼接空字符串,concat会稍快,在速度上两者可以忽略不计,如果拼接更多字符串建议用StringBuilder。
-
从字节码来看+号编译后就是使用了StringBuiler来拼接,所以一行+++的语句就会创建一个StringBuilder,多条+++语句就会创建多个,所以为什么建议用StringBuilder的原因。
C# 反射扩展
using System;
using System.Reflection;
public static class AccessExtensions
{
public static T InvokeConstructor<T>(this Type type, Type[] paramTypes = null, object[] paramValues = null)
{
return (T)type.InvokeConstructor(paramTypes, paramValues);
}
public static object InvokeConstructor(this Type type, Type[] paramTypes = null, object[] paramValues = null)
{
if (paramTypes == null || paramValues == null)
{
paramTypes = new Type[] { };
paramValues = new object[] { };
}
var constructor = type.GetConstructor(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic, null, paramTypes, null);
return constructor.Invoke(paramValues);
}
public static T Invoke<T>(this object o, string methodName, params object[] args)
{
var value = o.Invoke(methodName, args);
if (value != null)
{
return (T)value;
}
return default(T);
}
public static T Invoke<T>(this object o, string methodName, Type[] types, params object[] args)
{
var value = o.Invoke(methodName, types, args);
if (value != null)
{
return (T)value;
}
return default(T);
}
public static object Invoke(this object o, string methodName, params object[] args)
{
Type[] types = new Type[args.Length];
for (int i = 0; i < args.Length; i++)
types[i] = args[i] == null ? null : args[i].GetType();
return o.Invoke(methodName, types, args);
}
public static object Invoke(this object o, string methodName, Type[] types, params object[] args)
{
var type = o is Type ? (Type)o : o.GetType();
var method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic, null, CallingConventions.Any, types, null);
if (method == null)
method = type.GetMethod(methodName, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
return method.Invoke(o, args);
}
public static T GetFieldValue<T>(this object o, string name)
{
var value = o.GetFieldValue(name);
if (value != null)
{
return (T)value;
}
return default(T);
}
public static object GetFieldValue(this object o, string name)
{
var field = o.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
return field.GetValue(o);
}
return null;
}
public static void SetFieldValue(this object o, string name, object value)
{
var field = o.GetType().GetField(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (field != null)
{
field.SetValue(o, value);
}
}
public static T GetPropertyValue<T>(this object o, string name)
{
var value = o.GetPropertyValue(name);
if (value != null)
{
return (T)value;
}
return default(T);
}
public static object GetPropertyValue(this object o, string name)
{
var property = o.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null)
{
return property.GetValue(o, null);
}
return null;
}
public static void SetPropertyValue(this object o, string name, object value)
{
var property = o.GetType().GetProperty(name, BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);
if (property != null)
{
property.SetValue(o, value, null);
}
}
}
///
Environment.CurrentDirectory 在Unity里,是到,打开 显示 Assets和ProjectSettings的那层
修改文件夹里的文件名:因为我的lua文件(后缀为.lua)被莫名其妙的改成文本文件,并且后缀都变成.lua.txt
string inputPath = "C:/Users/Administrator/Desktop/Client7/Assets";
if (!Directory.Exists(inputPath)) return ;
string[] pathArr = Directory.GetFiles(inputPath, "*.Lua.txt", SearchOption.AllDirectories);
Console.WriteLine("pathArr : " + pathArr.Length);
for (int i = 0; i < pathArr.Length; i++)
{
Console.WriteLine("pathArr: " + pathArr[i]);
//pathArr[i] = pathArr[i].Replace(".lua", "");
string newPath = System.IO.Path.ChangeExtension(pathArr[i], ".lua");
File.Move(pathArr[i], newPath);
Console.WriteLine("bb: " + newPath);
}
|
枚举反射,根据枚举中的val或者data读取值和描述
举例实用:
1 Type t = Assembly.Load("XXX.SDK").GetType("XXX.SDK.Entities." + ObjType);
2 var dataList = new List<object>();
3 foreach (var value in Enum.GetValues(t))
4 {
5
6 object[] objAttrs = value.GetType().GetField(value.ToString()).GetCustomAttributes(typeof(DescriptionAttribute), true);
7 DescriptionAttribute descAttr = objAttrs[0] as DescriptionAttribute;
8 var date = new
9 {
10 Description = descAttr.Description,
11 Name = value.ToString(),
12 value = Convert.ToInt32(value)
13 };
14 dataList.Add(date);
15 }
根据枚举的名字,读出枚举的描述,内容和值。
UserCardStatus userCardStatu = (UserCardStatus)Enum.Parse(typeof(UserCardStatus), result.user_card_status, true);
string txt = GetEnumDescription(userCardStatu);
public string GetEnumDescription(Enum enumValue)
{
string str = enumValue.ToString();
FieldInfo field = enumValue.GetType().GetField(str);
object[] objs = field.GetCustomAttributes(typeof(DescriptionAttribute), false);
if (objs == null || objs.Length == 0) return str;
DescriptionAttribute da = (DescriptionAttribute)objs[0];
return da.Description;
}
根据枚举的单个内容,读出描述