03-C#.Net-特性-面试题

Rancher入门到精通 - Nginx Ingress 配置指南 Rancher 是一个开源的容器管理平台,它提供了一套完整且易于使用的工具来部署、管理和扩展容器化应用。而 Nginx Ingress 则是一个常用的开源 Ingress 控制器,用于将外部请求流量导入到 Kubernetes 集群中的服务。在开始之前,请确保您已经正确安装了 Rancher 平台和 Nginx Ingress 控制器。 阅读详情

Q1:特性和注释有什么区别?特性的本质是什么?

出题意图: 考察对特性基础概念的理解,区分"会用"和"真懂"。

答:

注释在编译后不存在,只是给人看的文字说明。特性编译后以元数据形式存储在程序集中,运行时可以通过反射读取,能携带数据和逻辑,真正影响程序行为。

特性的本质是一个类,直接或间接继承自 System.Attribute。用 [] 标记在代码元素上,本质上是在调用这个类的构造函数。

// 这两行等价
[Custom(123)]
public class Student { }

// 编译器实际做的事:在元数据中记录 new CustomAttribute(123)

解答思路: 先说核心区别(编译后是否存在),再说本质(是一个类),最后点出标记语法的本质是调用构造函数。


Q2:AttributeUsage 的三个参数分别是什么作用?

出题意图: 考察自定义特性的规范写法,有没有实际写过特性。

答:

AttributeUsage 用来约束自定义特性的使用方式,三个参数:

  • AttributeTargets:指定特性能标记在哪里(类、方法、属性、字段等),建议每次自定义特性都明确指定,防止误用。可以用 | 组合多个目标。
  • AllowMultiple:同一位置是否允许重复标记,默认 false。验证框架里一个属性需要同时标 [Required] 和 [Length],就需要设为 true。
  • Inherited:子类是否继承父类上的特性,默认 true。
[AttributeUsage(AttributeTargets.Property, AllowMultiple = true, Inherited = false)]
public class ValidateAttribute : Attribute { }

解答思路: 逐个说清楚,重点举 AllowMultiple 的实际使用场景,体现实战经验。


Q3:特性标记后为什么不能直接调用?怎么让特性生效?

出题意图: 考察对特性运行机制的理解,很多人只会标记特性,不知道背后原理。

答:

特性标记只是在元数据中记录了"这里有一个特性实例",并不会自动执行任何代码。要让特性生效,必须通过反射主动获取特性实例,然后调用其中的方法。

标准流程:先用 IsDefined() 判断是否存在(避免无谓开销),再用 GetCustomAttribute<T>() 获取实例,最后调用实例方法。

Type type = typeof(Student);

if (type.IsDefined(typeof(CustomAttribute), true))
{
    CustomAttribute attr = type.GetCustomAttribute<CustomAttribute>();
    attr.Do(); // 这里才真正执行特性中的逻辑
}

解答思路: 说清楚"标记 ≠ 执行",反射是让特性生效的唯一途径,顺带提性能优化(先判断再获取)。


Q4:如何用特性+反射实现枚举的描述信息获取?

出题意图: 这是特性"获取额外信息"的经典场景,考察能否把特性用在实际业务中。

答:

定义一个 RemarkAttribute 标记在枚举字段上,通过扩展方法封装反射逻辑,调用方只需 state.GetRemark()。

[AttributeUsage(AttributeTargets.Field)]
public class RemarkAttribute : Attribute
{
    private readonly string _desc;
    public RemarkAttribute(string desc) => _desc = desc;
    public string GetRemark() => _desc;
}

public enum OrderStatus
{
    [Remark("待支付")] Pending = 1,
    [Remark("已完成")] Completed = 2
}

public static class EnumExtension
{
    public static string GetRemark(this Enum @enum)
    {
        FieldInfo field = @enum.GetType().GetField(@enum.ToString());
        if (field.IsDefined(typeof(RemarkAttribute), true))
            return field.GetCustomAttribute<RemarkAttribute>().GetRemark();
        return @enum.ToString();
    }
}

// 使用
Console.WriteLine(OrderStatus.Pending.GetRemark()); // 待支付

好处:新增枚举值只加一行标记,描述改了只改标记处,获取逻辑完全不动。

解答思路: 先说传统 if-else 的问题,再给出特性方案,最后说明优势。能写出扩展方法封装是加分项。


Q5:请设计一个基于特性的数据验证框架,要求支持扩展新的验证规则

出题意图: 综合考察特性+反射+面向对象设计(开闭原则),是中高级岗位的常见题,考察架构思维。

答:

核心设计:抽象基类定义统一接口,具体验证规则继承实现,验证管理器只依赖抽象基类,新增规则不改已有代码。

// 1. 抽象基类
public abstract class AbstractValidateAttribute : Attribute
{
    public abstract (bool ok, string error) Validate(object value);
}

// 2. 具体规则
[AttributeUsage(AttributeTargets.Property)]
public class RequiredAttribute : AbstractValidateAttribute
{
    private readonly string _msg;
    public RequiredAttribute(string msg) => _msg = msg;

    public override (bool ok, string error) Validate(object value)
    {
        bool ok = value != null && !string.IsNullOrWhiteSpace(value.ToString());
        return (ok, ok ? null : _msg);
    }
}

[AttributeUsage(AttributeTargets.Property)]
public class LengthAttribute : AbstractValidateAttribute
{
    private readonly int _min, _max;
    public string ErrorMsg { get; set; }
    public LengthAttribute(int min, int max) { _min = min; _max = max; }

    public override (bool ok, string error) Validate(object value)
    {
        if (value == null) return (true, null);
        int len = value.ToString().Length;
        bool ok = len >= _min && len <= _max;
        return (ok, ok ? null : ErrorMsg);
    }
}

// 3. 验证管理器
public static class Validator
{
    public static (bool ok, string error) Validate<T>(T obj) where T : class
    {
        foreach (PropertyInfo prop in typeof(T).GetProperties())
        {
            if (!prop.IsDefined(typeof(AbstractValidateAttribute), true)) continue;

            object value = prop.GetValue(obj);
            foreach (AbstractValidateAttribute attr in prop.GetCustomAttributes<AbstractValidateAttribute>())
            {
                var (ok, error) = attr.Validate(value);
                if (!ok) return (false, error);
            }
        }
        return (true, null);
    }
}

// 4. 使用
public class UserDto
{
    [Required("姓名不能为空")]
    public string Name { get; set; }

    [Required("手机号不能为空")]
    [Length(11, 11, ErrorMsg = "手机号必须11位")]
    public string Mobile { get; set; }
}

var (ok, error) = Validator.Validate(new UserDto { Name = "张三", Mobile = "123" });
// ok=false, error="手机号必须11位"

扩展新规则只需新建一个继承 AbstractValidateAttribute 的类,Validator 完全不用改。

解答思路: 先说设计思路(抽象基类+开闭原则),再写代码,最后说明扩展方式。能主动提到"不改 Validator 就能扩展"是加分项。


Q6:反射获取特性时,IsDefined 和 GetCustomAttributes 都能判断特性是否存在,为什么推荐先用 IsDefined?

出题意图: 考察对反射性能的关注,体现候选人有没有在意代码质量。

答:

GetCustomAttributes() 会实例化所有特性对象并返回数组,即使你只是想判断"有没有",也会产生对象分配开销。IsDefined() 只做元数据检查,不创建特性实例,性能更好。

在循环中遍历大量属性/方法时,这个差异会被放大:

// 推荐:先判断,有才获取
if (prop.IsDefined(typeof(RequiredAttribute), true))
{
    var attr = prop.GetCustomAttribute<RequiredAttribute>();
    attr.Validate(value);
}

// 不推荐:每次都创建实例,即使不需要
var attrs = prop.GetCustomAttributes<RequiredAttribute>(true);
if (attrs.Any()) { ... }

解答思路: 说清楚两者的本质区别(是否创建实例),结合循环场景说明影响。


Q7:特性的 Inherited 参数设为 true 时,子类能获取到父类的特性吗?有什么注意事项?

出题意图: 考察对特性继承机制的细节掌握,容易踩坑的地方。

答:

Inherited = true 时,通过 GetCustomAttributes(true) 可以获取到继承链上的特性。但有一个重要细节:接口上的特性不会被实现类继承,只有类上的特性才会被子类继承。

[AttributeUsage(AttributeTargets.Class, Inherited = true)]
public class TagAttribute : Attribute { }

[Tag]
public class Base { }

public class Child : Base { }

// 可以获取到,因为 Child 继承自 Base
bool has = typeof(Child).IsDefined(typeof(TagAttribute), true); // true

// 接口上的特性不会被实现类继承
[Tag]
public interface IService { }

public class MyService : IService { }
bool hasFromInterface = typeof(MyService).IsDefined(typeof(TagAttribute), true); // false

另外,GetCustomAttributes(false) 只获取当前类型自身的特性,不搜索继承链。

解答思路: 先回答"可以",再说接口特性不继承这个坑,最后说 false/true 参数的区别。

麒麟操作系统提示“默认密钥环已上锁”的解决办法 阅读详情

相关推荐

matlab kwave模拟超声换能器学习笔记

kwave模拟超声换能器的学习笔记,从零开始造车轮

SolvingMaster的博客 3196

.Net面试题1

.Net面试题 0.122019.03.01 10:29:58字数 1989阅读 875 简介 古人云“温故而知新,可以为师矣”。希望总结的面试题能对大家的面试带来帮助。 本文面向的阅读读者是 刚毕业的萌新 工作不久换工作同学 1.C# 值类型和引用类型的区别 赋值时的区别:值类型的变量将直接获得一个真实的数据副本,初值为0;而对引用类型的赋值仅仅是把对象的引用赋给变量,这样就可能导致...

weixin_42045719的博客 275

国科GK7202V300芯片开发避坑指南:从uboot编译到SDK配置的12个实战问题解决

本文针对国科GK7202V300芯片开发过程中的常见难题,提供从uboot编译、SDK配置到系统部署的实战解决方案。详细解析了开发环境搭建、内核编译、驱动模块加载、根文件系统构建及烧写部署等12个关键环节的避坑指南,帮助开发者高效解决编译错误、配置冲突等典型问题,提升开发效率。

sunny的博客 233

2024 .Net 面试题

装箱:从值类型转换到引用类型。拆箱:从引用类型转换到值类型。虚函数:可由子类重写父类的函数。抽象函数:非抽象子类必须重写的函数。多个线程在并行执行且使用到了共享数据,最终得到了正确结果的就是线程安全的,如果结果不正确就是非线程安全允许程序在等待耗时操作完成时,不阻塞执行线程,提高应用程序的响应性。通过async标记异步方法,在异步方法内部使用await等待异步操作完成,在此期间,控制权会返回给调用者,以便执行其他任务,直到异步操作完成后再继续执行await之后的代码。可空类型。通过使用?

dxh0515的博客 9300

CST仿真微带贴片天线学习笔记

谐振频率为3.48GHz,基板采用Rogers RT5880板材,介电常数2.2,损耗角正切0.0009,厚度1.57mm,馈电方式为同轴馈电。

qq_36521926的博客 9431

QGroundControl高级配置与自定义功能实战指南

本文深入探讨了QGroundControl(QGC)的高级配置与自定义功能,为无人机开发者、系统集成商和高级用户提供实战指南。内容涵盖从品牌界面定制、自定义MAVLink消息处理,到插件开发与自动化部署的全流程,旨在帮助用户解锁QGC的隐藏潜力,打造专属的行业解决方案。

weixin_29234509的博客 239

c#面试题及答案

c#面试题及答案  传松门: //点击打开链接 1:a=10,b=15,在不用第三方变量的前提下,把a,b的值互换 2:已知数组int[] max={6,5,2,9,7,4,0};用快速排序算法按降序对其进行排列,并返回数组 3:请简述面向对象的多态的特性及意义! 4:session喜欢丢值且占内存,Cookis不安全,请问用什么办法代替这两种原始的方法 5:对数据的并发采用什么

柠檬、别离 2216

SAP特殊采购类80实战:跨工厂生产配置避坑指南(附完整测试流程)

本文深入解析SAP特殊采购类80在跨工厂生产场景下的实战应用与配置要点。文章从核心业务逻辑出发,详细拆解了后台配置、主数据与BOM的“双工厂”思维模式,并提供了从创建需求到成品收货的完整测试流程。重点揭示了多层BOM下的需求传递陷阱及常见报错解决方案,旨在帮助SAP顾问及用户规避实施风险,实现资源的灵活调度与流程自动化。

wind6的博客 1138

企业级.net笔试题,面试题第一篇

当前位置:首页 >> IT >> .NET 2010 .net开发程序员面试题 106 类别:ASP.NET发布时间:2010-12-26来源:一个顶俩年份:2010进入 .net开发基础知识面试题系列一 99 类别:ASP.NET发布时间:2010-12-26来源:一个顶俩年份:2010进入 .Net笔试38道题(

situ7886的专栏 656

Xilinx Aurora 8B/10B IP核详解和仿真

Xilinx Aurora 8b/10b IP核的详解,以及使用与仿真示例,对IP核的配置和如何仿真有非常详细的说明,除了对IP核官方文档的内容进行了解析以外,还对GTX引脚的选择等比较容易混淆和不好理解的地方进行了说明。最后对IP核的仿真运行进行了STEP BY STEP 的说明,对仿真的结果也进行了简要的说明。 该文档对Xilinx FPGA和ZYNQ SOC下 AURORA 8B/10B IP核的使用提供了一个快速上手的指导。

weixin_43354598的博客 1万+

基于YOLOv8的MVTec AD缺陷检测系统设计与实现

速度快,精度高;支持 anchor-free 架构;支持实例分割和图像分类;模块化代码,易于部署与改进;完美兼容 ONNX、TensorRT 等推理框架;官方支持多平台训练和推理(CPU/GPU)。YOLOv8 是工业视觉检测落地非常理想的选择。MVTec AD(Anomaly Detection)数据集包括15类工业对象,每个对象包括多个子类缺陷(例如 “scratch”, “crack”, “hole”)及正常图像。类别缺陷子类bottlecablecapsule。

YOLO 931

.NET周刊【3月第4期 2025-03-23】

本文详细讲解了SQL中的不同Join操作及其用法,包括Inner Join、Left Join、Right Join和Full Join,同时解释了On和Where子句的区别与应用。文章通过示例代码阐明了每种Join的特点,帮助初学者理解如何选择合适的连接方式,避免常见错误。使用MS SQL Server进行演示,使内容更具实用性和可操作性。整体条理清晰,适合各个水平的开发者学习和参考。

InCerry的博客 1154

HQChart实战教程19 - PC端分时图定制tooltip

HQChart实战教程19 - PC端分时图定制tooltip序效果步骤1. 创建一个外部tooltip的div2. 注册标题绘制事件3. 标题绘制回调函数格式说明eventdataobjtooltip显示函数HQChart代码地址 序 hqchart分时图是不带tooltip, 如果我们需要在PC端页面显示tooltip,我们可以通过注册绘制标题事件,来自己做一个div显示数据。 参考教程HQChart实战教程7-自定义显示手势点击K线显示信息 效果 步骤 1. 创建一个外部tooltip的div 在外

小银 2447

net面试题目

 2008-03-15 20:401. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里? 2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml?(讲概念就行了)3. C#, Java 和 c++的特点,有什么相同的地方,不同的地方,C#分别从c++和java中吸取了他们那

jasonvip_c的专栏 545

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

.NET面试题解析(03)-string与字符串操作

.NET面试题解析(03)-string与字符串操作 常见面试题目: 1.字符串是引用类型类型还是值类型? 2.在字符串连接处理中,最好采用什么方式,理由是什么? 3.使用 StringBuilder时,需要注意些什么问题? 4.以下代码执行后内存中会存在多少...

LJianDong的博客 266

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

.NET面试题

  .NET面试题 1.请说明在.net中常用的几种页面间传递参数的方法,并说出他们的优缺点。session(viewstate) 简单,但易丢失application 全局cookie 简单,但可能不支持,可能被伪造input ttype="hidden" 简单,可能被伪造url参数简单,显示于地址栏,长度有限数据库稳定,安全,但性能相对弱2.override与重载的区别Override用来

highfly2008的专栏 472

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

杭州驿商科技 .net,C#面试题(2023-5-1)

27、(开放题)0A考勤管理系统分为三大块,管理员功能、主管功能和员工功能,请实现以下两大大功能:1.员工能查看自己每天的打卡时间,请假申请及审批状态;25、写出一条sql语句:取出表A中第31到第40记录(以自动增长的ID作为主键,注意:ID可能不是连续的。(4)查询选课学生所选课程的课程号和成绩,以及该学生的姓名和性别。(7)把学生证号为90876的学生所选的01号课程成绩改为80分。(3)查询数学类课程的课程号和课程名(模糊查询,以S开头)SC(学生证号,课程号,成绩,授课教师)

qq_48200524的博客 284

.NET面试题 - 4

<br />Q1. C#中 property 与 attribute的区别,他们各有什么用处,这种机制的好处在哪里? <br />答:Property用来封装类的成员,可以通过逻辑限制对成员的读写及可访问性。而Attribute是一种标记类,通过反射获取Attribute信息可以获得一个类的部分特性。 <br /> <br />Q2. 讲一讲你理解的web service,在dot net framework中,怎么很好的结合xml? <br />答:Web Service通过SOAP协议(本质是XML数据

pp_zz的专栏 463

# C# 基础编程 面试题汇总(一)

编程语言的概念与分类编程语言是用来定义计算机程序的语言,是一种被标准化的交流技巧,用来向计算机发出指令;计算机按照指令集中的指令执行。计算机语言的种类非常多,总体上分为三大类:机器语言:一种指令集的体系,该指令集称机器码(machine code),是电脑的 CPU 可直接解读的数据,又称原生码(Native Code),与运行平台相关。汇编语言:用于电子计算机、微处理器等可编程器件的低级语言,又称符号语言;用助记符(Mnemonics)代替机器指令的操作码,用地址符号或标号代替指令或操作数的地址。

2401_84182005的博客 498

.NET面试题集锦②

一、前言部分 文中的问题及答案多收集整理自网络,不保证100%准确,还望斟酌采纳。 1.实现产生一个int数组,长度为100,并向其中随机插入1-100,并且不能重复。 1 int[] intArr=new int[100]; 2 ArrayList myList=new ArrayList(); 3 Random rnd=new Random(); 4 wh...

893

net程序员面试题,基本上是基础概念题

1.面向对象的思想主要包括什么? 2.什么是ASP.net中的用户控件 3.什么叫应用程序域?什么是受管制的代码?什么是强类型系统?什么是装箱和拆箱?什么是重载?CTS、CLS和CLR分别作何解释? 4.列举一下你所了解的XML技术及其应用 5.值类型和引用类型的区别?写出C#的样例代码。 6.ADO.net中常用的对象有哪些?分别描述一下。 7.如何理解委托? 8.C#中的接口...

weixin_30491641的博客 464

C#/.NET开发者系统学习指南:从语言基础到架构实战

C#作为面向对象的编程语言,其核心在于类型安全、内存管理和丰富的语法特性,为构建企业级应用提供了坚实基础。在.NET平台上,通过公共语言运行时(CLR)实现跨语言互操作和自动内存管理,结合ASP.NET Core等框架,开发者能够高效构建高性能的Web服务。掌握C#异步编程、LINQ查询和依赖注入等技术,不仅能提升代码的可维护性和性能,还能应对微服务、云原生等现代架构需求。本文聚焦于一套整合了C#语言核心、.NET平台框架、Web开发实战及架构设计模式的系统性学习资料,通过涵盖Entity Framewor

weixin_30292843的博客 385

.NET 高级开发实战:从面试题到架构设计

本文深入探讨.NET高级开发实战,从面试题解析到架构设计,涵盖.NET Core、C#高级特性及微服务架构。通过实际案例展示如何将理论知识转化为解决方案,提升开发效率和系统性能,适合中高级.NET开发者进阶学习。

weixin_29266007的博客 98

【JVM】对象内存布局

HotSpot JVM 中,Java 对象内存布局由对象头(12字节,含Mark Word与压缩Klass Pointer)、实例数据及对齐填充构成,总大小为8字节倍数。对象头支持锁状态动态复用,指针压缩使引用仅4字节,但堆超32GB时失效。实例字段按类型优先级重排序以减少间隙,最小对象大小为16字节。通过JOL工具可精准验证布局,理解锁机制、GC、伪共享等底层行为。

2301_79732484的博客 140
上一篇: 03-C#.Net-特性-学习笔记
下一篇: 04-C#.Net-委托和事件-学习笔记
似水明俊德
博客等级 码龄8年 247粉丝 276原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值