C#的语法和java非常类似,但是他拥有非常多的语法糖,比如声明类的时候set/get的简单写法,而在java中需要特定的插件lombok支持,而使用lombok插件有一个很大的缺点,就是协同开发的人都要安装,否则程序就会报错,还有一点覆盖方法C#使用override关键字,而java使用的是注解
class Person
{
public int gender { get; set; }
public int age { get; set; }
public string name { get; set; }
//必须提供无参构造
public Person()
{
}
public Person(string name, int gender, int age)
{
this.gender = gender;
this.age = age;
this.name = name;
}
public override string ToString()
{
return "Person{" +
"name='" + name + '\'' +
", gender=" + gender +
", age=" + age +
'}';
}
}
弄完了类声明,然后就是创建对象初始化列表,和java的实现方法大同小异,但是我并没有使用下面的工厂方法,而是使用了对象初始化的写法,他非常类似于js里面对象字面值的快速赋值语法,但是其实他是对无参构造函数的补充,必须显示声明无参构造函数,对比有参构造函数他是不用考虑顺序的,另外也可以使用类型推断var去声明一个对象,这些类脚本语言的特性竟然被官方支持,不得不说是一大惊喜
//对象初始化
//var p = new Person() { gender = 1, name = "a", age = 1 };
//工厂方法
Person giveMePerson(string name, int gender, int age)
{
return new Person(name, gender, age);
}
var ps = new Person[]
{
new Person(){ name= "小萌", gender = 1, age = 19 },
new Person(){ name= "小强", age = 23, gender = 1 },
new Person(){ gender = 2, name = "小爱", age = 15 },
new Person(){ gender = 2, age = 18 , name = "小A" }
};
List<Person> plist = ps.ToList();
var result1 = plist.Where(predicate: person => {
return person.name.Contains("A") && person.gender == 2;
}).First();
List<Person> result2 = plist.Where(predicate:person =>
{
return person.age > 10 && person.gender == 1;
}).ToList();
Console.WriteLine(result1);
Console.WriteLine("---------------------------------------");
result2.ForEach(action: person =>
{
Console.WriteLine(person);
});
然后就是List列表对象的Where方法,他和C#linq从入门到放弃中用到的Select方法都是linq原始写法的封装,他接受一个委托对象predicate作为参数,是找对象的几个常用的方法,最后迭代器的写法和java也是一样的,这里又体现了一个和java不一样的地方,这是Where的方法签名
public static IEnumerable<TSource> Where<TSource>(this IEnumerable<TSource> source, Func<TSource, bool> predicate)
Where是静态方法,但是却可以被对象实例调用,在java中静态方法不保存this,也不能为对象实例调用,只能用类调用,最后还记得result1和result2的值是啥不
控制台输出