昨天跑到东北师大招聘会面试, 一位面试官问我:"说说C#中的属性, 严格来讲应该是特性"
东北师大昨天有个大型的招聘会, 今天吉大有, 今天的这个我没去, 说说昨天的经历吧。总的来说吧, 计算机的方面的真多, 我同学还听见有人尴尬说, 当初学计算机就好, 找工作也不会这么愁了, 作为计算机的, 说句公道话, 计算机专业的就是找工作的时候机会多而已, 但是走技术路线要求也是很高的, 先不说学历(昨天有个公司的应聘人员清一色研究生...我同学跑过去了, 问了两句, 看了下应聘人员名单, 就走了, 有点尴尬, 因为那些都是2清一色的计算机研究生硕士学位...), 其次就是技术能力了, 讲真, 计算机的这个专业, 没有技术真混不开, 说白了一句话, 你需要学到老学到老, 因为技术变革太快了, 你需要掌握的很多, 单单是语言就需要掌握多个语言, 没有一个程序员是只会一门语言的, 其次就是广度与深度了, 尽管现在框架满天跑, 但是讲真, 光会用真没有, 你需要的就是了解底层, 而且你觉得你真会用那些框架? 而且一个框架是远远不够的, 一言不合就是三四个框架。哎, 废话太多, 总而言之一句话, 计算机其实也不好找工作, 只是机会多.
扯淡完了, 说正题吧, 我找了一家专门搞asp.net的公司, 为什么说专门呢!我特意问了下, 他们用不用asp.net core, 一句话, 我们现在的产品不需要跨平台*-*, 这家公司有点靠谱(最起码比我投简历的前两家靠谱, 因为是一个懂技术的人来面试, 估计是个技术主管, 因为他的年纪比我爸还大, 其余的企业都是女HR, 长得一般吧, 没有我在武汉实习那家公司的女HR漂亮)。一来就问我C#中的一些好用的特性, 我有半年没用c#了, 一直在学python, 我原本打算面python的, 结果140家没有一家招python, 我也是很无奈, 能回答出来都是靠自己大二大三的积累, 讲真, 还好当初好好学了点, 但是也忘了很多重要的. 随后再说。凭记忆我说了lambda表达式, async/await, 还有我忘了...说完了C#的一些好用的特性(类似语法糖), 我装了下逼, 反正那位和蔼的老叔叔(他实在太和蔼了, 说话轻声细语的, 很好听*.*, 而且有些许白发)也不懂python, 我就对比了下两者, 也算是个加分点吧(面试一开始我就说了, 我原本打算面python的, 好久没用C#了, 比较生疏, 他说没事没事, 想说啥说啥, 我就不客气了*-*), 数据结构是必须的, 问了我快排, 我之前学设计模式之策略模式的时候, 看到资料上说asp.net的排序算法是用策略模式进行设计的, 哎, 说到这个真无奈啊, 我当时忘了是啥设计模式了, 就没有说到这个点。他问的也比较笼统, 我也没有怎么说, 然后还有其他的一些, 我完全凭印象说的, 随后就是我们文章的重头戏了, "你觉得C#中的属性, 严格来讲应该是特性, 有什么用, 你用过吗?" 我当然用过了, 但是我当时忘了, 因为一开始我听成了属性, 就扯淡说C#2.0属性定义比较麻烦, get, set设置还得引入第三个变量, C# 3.0之后就直接一个花括号里面加个get;set就行, 这就是一个属性, 等我说完, 他说不是属性, 是特性。 这个我还真懂!当初特意研究了这个, asp.net mvc框架的过滤器其实就是特性的一种, 我写了一篇文章<<ASP.NET MVC Filter的思考 >> <<Attribute在.net编程中的应用(二)>>我当初还一边摸着头一边研究这玩意(因为序列化就是基于特性attribute的), 写的有点抽象, 研究起来有点难...我还思考了下asp.net中AOP, 其实可以理解为attribute, 哎, 这些都没有说出来, 因为我忘了o(╥﹏╥)o, 然后就没有答上来, 技术问完之后, 我扯淡了一会, 问了下他们的项目之类的, 他说部署在微软云上, 本来就对azure感兴趣, 因此深入问了下他一些, 还扯了一些自己的思考问题, 聊得还行吧, 他们的SQL SERVER是2014版本的, 我就顺嘴问了句, 对比Oracle怎么样, 我说其实现在的SQL SERVER不比oracle差, 很巧, 看法一样, 说了一些相关的, 哦, 对, 他问我, 关键词检索你会怎么做, 我说sql模糊查询 + 缓存(memcached) + C#代码优化(比如string类型少用之类的), 明显回答不好, 我也就能想到这些了, 不可能像百度, 谷歌搜索那样有专门的算法, 其实应该有, 只不过没有不是那么大的算法, 关于这个我特意问了下我专业算法科老师, 回头和她讨论下, 这是个很不错的老师!博客园的搜索就做的很不错, 不知道是什么思路, 除去最基本的sql模糊查询, 缓存之外还有啥?总的来说, 应该有一个很好的设计思路(也算是算法吧), 不知道是怎么样的?C#不比Python, C# 的搜索库不怎么了解, python就光说词云处理就有好几个库, 搜索的库也有好几个库, 关键词搜索说白了, 先是断句, 随后选择关键的词去sql查询, 断句就是一个算法, 这也是最基本的, 搜索结果很大程度上取决于这个断句, 而Python做词云处理很不错, 库多啊, C#不了解了,哎, 这些当时都没有说o(╥﹏╥)o
这次面试感觉不好, 没想到不招python, asp.net面试准备不足, 全是靠自己大二大三的积累, 加上比较紧张, 一些基本的没有想起来, 哎...还是基础不扎实, 面试的确就是面基础 + 一定的自我思考。东北师大不错, 环境, 学习氛围, 有点想考研了, 读个真正的好学校....我朋友还加了一句, 东北师大女生穿衣风格和气质都和普通院校不一样,挺漂亮的, 有知性美...我一脚踹过去了,说了一句死胖子。
回到C#代码上:
[你必须知道的.NET] 第三回:历史纠葛:特性和属性
/* 特性就是为目标元素, 可以是数据集, 模块, 类, 属性, 方法, 甚至是函数参数等加入附加信息, 类似于注释, 但是可以在运行期间以反射的方式获得。 * 特性主要应用在序列化, 编译器指令, 设计模式, ORM等方面 */ [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true)] public class MyselfAttribute : System.Attribute { public string Name { get; set; } public int Age { get; set; } public string Memo { get; set; } public MyselfAttribute() { } public MyselfAttribute(string name, int age) { Name = name; Age = age; } public void ShowName() { Console.WriteLine("Hello, {0}", Name == null ? null : "world."); } } [MyselfAttribute("Ryan", 22)] public class mytest { [MyselfAttribute("Ryan", 22)] public void SayHello() { Console.WriteLine("Hello, asp.net "); } } class Program { static void Main(string[] args) { //mytest test = new mytest(); //test.SayHello(); Type tp = typeof(mytest); //获取成员方法的反射信息 MemberInfo methof_info = tp.GetMethod("SayHello"); MyselfAttribute myAttribute = (MyselfAttribute)Attribute.GetCustomAttribute(methof_info, typeof(MyselfAttribute)); if (myAttribute != null) { Console.WriteLine("你查看的是{0}的反射信息", methof_info.Name); Console.WriteLine("Name: {0}", myAttribute.Name); Console.WriteLine("Age: {0}", myAttribute.Age); Console.WriteLine("Memo of {0} is {1}", myAttribute.Name, myAttribute.Memo); myAttribute.ShowName(); } //获取类的反射信息 MemberInfo info = tp; MyselfAttribute class_myAttribute = (MyselfAttribute)Attribute.GetCustomAttribute(info, typeof(MyselfAttribute)); if (class_myAttribute != null) { Console.WriteLine("你查看的是{0}的反射信息", info.Name); Console.WriteLine("Name: {0}", class_myAttribute.Name); Console.WriteLine("Age: {0}", class_myAttribute.Age); Console.WriteLine("Memo of {0} is {1}", class_myAttribute.Name, class_myAttribute.Memo); class_myAttribute.ShowName(); } Console.Read(); } }