C#7.0语法糖,VS2017可用
class Program
{
static void Main(string[] args)
{
try
{
//ref变量
//TestRef();
//ref方法
//TestRefFunction();
//valueTuple
//TestValueTuple();
//类型转换
//TestTypeConvert(20);
//内部方法
//TestLocalFunction();
//一行代码的方法
//TestFunctionForSingleLineCode();
//数字可视化
//TestNumber();
//异常处理
//TestException();
//null处理
TestNull();
}
catch (Exception e)
{
Console.WriteLine("Error:" + e.Message);
}
}
private static void TestRef()
{
//定义值类型
decimal money = Convert.ToDecimal(88.88);
//把值类型赋值给另一个值类型
ref decimal newMoney = ref money;
//打印
Console.WriteLine($"money【{money}】,newMoney【{newMoney}】");
//修改原始的值类型,按道理来说值类型之间修改不会影响后来的,但是使用了ref,后赋值的变量也会跟着修改
money = Convert.ToDecimal(99.99);
//打印
Console.WriteLine($"money【{money}】,newMoney【{newMoney}】");
}
private static void TestValueTuple()
{
//获取用户信息
(string userName, int age, decimal money) user = GetUserInfo();
//打印
Console.WriteLine($"user:姓名【{user.userName}】,年龄【{user.age}】,余额【{user.money}】");
//获取用户信息
var user1 = GetUserInfo();
//打印
Console.WriteLine($"user1:姓名【{user1.userName}】,年龄【{user1.age}】,余额【{user1.money}】");
//定义元祖
(string title, string field, bool isRequired) columnItem = ("姓名", "UserName", true);
//打印
Console.WriteLine($"标题【{columnItem.title}】,字段名【{columnItem.field}】,是否必填【{columnItem.isRequired}】");
//再额外定义同名变量不会影响到原来的变量名
string title = "张三";
}
private static (string userName, int age, decimal money) GetUserInfo()
{
//使用元祖返回用户信息
return ("Ling、bug", 25, Convert.ToDecimal(66.66));
}
private static void TestTypeConvert(object obj)
{
//判断类型
if (obj is int)
{
//类型转换
int objInt1 = Convert.ToInt32(obj);
//打印
Console.WriteLine(objInt1);
}
//判断类型,如果是则直接转换
if (obj is int objInt2)
{
//打印
Console.WriteLine(objInt2);
}
}
private static void TestRefFunction()
{
//定义数组
var arr = new int[] { 1, 2, 3, 4, 5, 6 };
//打印
Console.WriteLine(string.Join(",", arr));
//获取值(调用ref方法,返回值和调用出都需要使用ref标识)
ref var num = ref GetArrayValueByIndex(arr, 2);
//修改获取到的值,原则上修改值类型,不会影响到原始值,但是由于使用了ref标识,则数组内该值会同步修改
num = 99;
//打印
Console.WriteLine(string.Join(",", arr));
}
private static ref T GetArrayValueByIndex<T>(T[] arr, int index)
{
//返回数组指定索引的值,但是这里使用ref标识之后,如果值被修改,数组会同步修改
return ref arr[index];
}
private static void TestLocalFunction()
{
//定义内部方法(不需要静态标识,不需要作用域标识)
(string name, int age) GetUserInfoByUserName(string name)
{
return (name + "Test", 26);
}
//调用局部方法
var user = GetUserInfoByUserName("Ling、bug");
//打印
Console.WriteLine($"姓名【{user.name}】,年龄【{user.age}】");
}
private static void TestFunctionForSingleLineCode()
{
//定义局部方法,因为只有一行代码,所以可以简写
int Sum(int x, int y) => x + y;
foreach (var a in Enumerable.Range(1, 10))
{
foreach (var b in Enumerable.Range(10, 15))
{
//打印求和结果
Console.WriteLine($"{a} + {b} = {Sum(a, b)}");
}
}
}
private static void TestNumber()
{
//数字为了可读性强,可以使用下划线(_)来分割,不影响实际值
//定义整数
int num1 = 123_456_78;
int num2 = 12345678;
//判断是否相等
Console.WriteLine(num1 == num2);
//定义小数
double money1 = 33.33_333;
double money2 = 33.33333;
//判断是否相等
Console.WriteLine(money1 == money2);
}
private static void TestException()
{
//是否是自定义异常
bool IsCustomException(Exception exception) => exception is LingbugException;
try
{
//自定义异常
throw new LingbugException("Ling、bug");
//异常
int a = Convert.ToInt32("Ling、bug");
}
catch (Exception ex) when (IsCustomException(ex))//try catch when判断为true之后才会执行后面的代码
{
//自定义异常
Console.WriteLine("自定义异常:" + ex.Message);
}
catch (Exception ex)
{
//非自定义异常
Console.WriteLine("不是自定义异常:" + ex.Message);
}
}
private static void TestNull()
{
//获取展示名称
string GetNameShow(string name) => name ?? "null";
//初始化学生
var student = new Student()
{
Name = "张三",
ClassInfo = new ClassModel()
{
ClassName = "一班",
Teacher = new Teacher()
{
TeacherName = "李老师"
}
}
};
//如果student不为null,则使用student.Name
string studentName = student?.Name;
//班级名称
string className = student?.ClassInfo?.ClassName;
//老师名称
string teacherName = student?.ClassInfo?.Teacher?.TeacherName;
//打印
Console.WriteLine($"学生姓名【{GetNameShow(studentName)}】,班级【{GetNameShow(className)}】,老师姓名【{GetNameShow(teacherName)}】");
}
}
Ending~