![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
CSharp
文章平均质量分 85
CRongQ
不忘初心,脚踏实地!
展开
-
(六)WPF - 资源和样式行为(1)
否则,如果使用静态资源,将仍然使用原来的颜色方案,直到用户重新启动应用程序为止。使用动态资源可以改善加载时间,对静态资源的引用总是发生在 Window 或 Page 加载之后,而对动态资源的引用要到实际使用时才会生效。每个元素都有自己的资源集合,并且为了找到期望的资源, WPF 在元素树中进行递归搜索。为了使用 XML 标记中的资源,需要一种引用资源的方法。动态资源只能用于设置依赖属性值,而静态资源可以在任何地方使用。使用静态资源时,必须总是在引用资源之前在标记中定义资源。动态资源需要占用更多的资源。原创 2023-06-23 19:58:07 · 1438 阅读 · 0 评论 -
(五)WPF - 依赖属性
第一步是定义表示属性的对象,它是 DependencyProperty 类的实例。属性信息应该始终保持可用,甚至可能需要在多个类之间共享这些信息。因此,必须将 DependencyProperty 对象定义为与其相关联的类的静态字段。字段的定义使用了 readonly 关键字,这意味着只能在 FrameworkElement 类的静态构造函数中对其进行设置。原创 2023-06-23 19:57:31 · 1251 阅读 · 0 评论 -
(四)WPF - 布局
FlowDirection 是 FrameworkElement (以及其他一些类)的属性,它可以改变元素的内部流的方向。RenderTransform(继承自 UIElement),它在布局结束后被应用(但在元素被渲染前)。LayoutTransform 没有原点的概念,因为被变换元素的定位是由父面板规则完全控制的。DockPanel 提供停靠支持,该容器中的子元素可以使用Dock属性来设置要停靠的容器边缘。用来处理面板子元素的布局问题,但它也可以应用于 那些内容在子控件中对齐的情况。原创 2023-06-23 19:57:00 · 883 阅读 · 0 评论 -
(三)WPF - XAML
set;set;set;set;break;break;break;原创 2023-06-23 19:51:40 · 738 阅读 · 0 评论 -
(二)WPF - 应用程序
从 Application 对象的构造器中初始化应用程序,或者处理 Startup 事件通常更好,因为 Application 在这里才完成它的内部初始化(例如,Application.Current 不会在构造器中进行设置)。在 WPF 中传递数据的一个简单的方式就是利用 Application 的 Properties 字典。:当系统运行于低内存的时候,如此少的可用资源以至于 CLR 都不能多分配一个字节了。在这样的情况下,没有任何代码能被即时编译,没有任何变量能被装箱,也没有任何对象能被分配。原创 2023-06-23 19:50:37 · 1181 阅读 · 0 评论 -
(一)WPF - WPF
如果处理指令接受多个数据参数,这些参数必须包含在 XProcessingInstruction 构造函数的第二个字符串参数中。XML 处理指令用于提供关于 XML 文档的使用和解释方法的额外数据。处理指令最常用于关联 XML 文档和样式表。可以使用 XProcessingInstruction 构造函数来包含处理指令。XML 文档从包含 XML 使用的版本号、使用的字符编码类型以及文档是否依赖外部引用的一行开始。特性提供了有关 XElement 节点的额外信息,它放在 XML 元素的开始标签中。原创 2023-06-23 19:47:09 · 1070 阅读 · 0 评论 -
(十一)CSharp-LINQ-LINQToXML(4)
如果处理指令接受多个数据参数,这些参数必须包含在 XProcessingInstruction 构造函数的第二个字符串参数中。XML 处理指令用于提供关于 XML 文档的使用和解释方法的额外数据。处理指令最常用于关联 XML 文档和样式表。可以使用 XProcessingInstruction 构造函数来包含处理指令。XML 文档从包含 XML 使用的版本号、使用的字符编码类型以及文档是否依赖外部引用的一行开始。特性提供了有关 XElement 节点的额外信息,它放在 XML 元素的开始标签中。原创 2023-06-23 16:51:34 · 692 阅读 · 0 评论 -
(十一)CSharp-LINQ-标准查询运算符(3)
一些运算符返回 Ienumerable 对象(或其他序列),而其他运算符返回标量。返回标量的运算符立即执行查询,并返回一个值,而不是一个可枚举类型对象。.NET 框架定义了两套泛型委托类型来用于标准查询运算符,即 Func 委托和 Action 委托。标准查询运算符由一系列 API 方法组成,API 能让我们查询任何 .NET 数组或集合。被查询的集合对象叫作序列,它必须实现 IEnumerable接口,其中 T 是类型。用作方法的运算符直接作用于序列对象,在这里就是 numbers 数组。原创 2023-06-23 16:50:51 · 1117 阅读 · 0 评论 -
(十一)CSharp-LINQ-查询表达式(2)
LINQ 中的 join 接受两个集合,然后创建一个新的集合,其中每一个元素包含两个原始集合中的元素成员。原创 2023-06-22 20:38:10 · 1014 阅读 · 0 评论 -
(十一)CSharp-LINQ(1)
数据库可以通过 SQL 进行访问,但在程序中,数据要被保存在差异很大的类对象或结构中。LINQ 查询可以返回两种类型的结果——可以是一个枚举,它是满足查询参数的项列表;也可以是一个叫作标量的单一值,它是满足查询条件的结果的某种摘要形式。上面的例子中,是对象初始化语句的赋值形式。C# 编译器会将使用查询语法表示的查询翻译为方法调用的形式。对于每一种数据源类型,一定有根据该数据源类型实现 LINQ 查询的代码模块。,也就是说,查询描述的是你想返回的东西,但并没有指明如何执行这个人查询。原创 2023-06-22 20:30:42 · 920 阅读 · 0 评论 -
(十二)反射与特性-自定义特性(2)
特性是一种特殊的类。用户自定义的特性类叫作自定义特性。所有特性类都派生自...由于特性持有目标的信息,所有特性类的公有成员字段属性构造函数特性类应用表示目标结构的某种状态。如果特性需要某些字段,可以通过包含具有位置参数的构造函数来收集数据,可选字段可以用采用命名参数按需初始化。除了属性之外,不要实现公有方法或其他函数成员。为了更安全,把特性类声明为 sealed。在特性声明中使用 AttributeUsage 来显式指定特性目标组。set;set;set;原创 2023-06-22 19:27:24 · 331 阅读 · 0 评论 -
(十二)反射与特性 -反射与预定义特性(1)
了解反射之前,要先了解一下元数据。元数据指保存在程序集中的一些有关程序及其类型的数据,包括类、结构、委托、接口和枚举等)的成员和成员的信息。程序在运行时,可以查看程序集以及其本身的元数据,是反射。通过反射,可以在运行时获取程序或程序集中的所有类型的元数据。反射指程序可以访问、检测和修改它本身状态或行为的一种能力。(来源:菜鸟教程)反射的命名空间是System.Reflection。.NET 中的反射特性是一种允许我们向程序的程序集添加元数据的语言结构。它是用于保存程序结构信息的特殊类型的类。原创 2023-06-20 18:01:17 · 700 阅读 · 0 评论 -
(十)异步-委托异步调用(4)
在轮询模式中,原始线程发起了异步方法的调用,做一些其他处理,然后使用 IAsyncResult 对象的 IsComplete 属性来定期检查开启的线程是否完成。当程序希望获取已完成的异步方法的结果时,可以检查 BeginInvoke 返回的 IAsyncResult 的 IsCompleted 属性,或调用委托的 EndInvoke 方法来等待委托完成。但是代码例子和书上的一摸一样。在发起的线程中的引用方法完成之后,发起的线程就会调用回调方法,由回调方法在调用 EndInvoke 之前处理异步方法的结果。原创 2023-06-18 07:55:29 · 403 阅读 · 0 评论 -
(十)异步-使用异步(3)
4秒后线程重新工作,这时其实是有把标签改变为 Doing Stuff 的,但是处理的时间太快,就立马执行下一条刷新的消息,所以肉眼上看不出内容改变的效果。当异步方法在处理程序代码里被调用时,异步方法里的 每次执行一个 await Task.Yield,就会把当前消息从消息队列中移除,再回到队列末尾,移交控制权给其他任务由处理器继续处理。但是如果某个消息的处理程序代码耗时过长,消息队列中的消息会产生积压(消息没有及时进行移除并处理),程序将会一时失去响应,在等待当前处理程序代码处理完成之前。原创 2023-06-18 06:10:49 · 1834 阅读 · 0 评论 -
(十)异步-什么是异步方法(2)
异步方法在完成其工作之前即返回到调用方法,然后在调用方法继续执行的时候完成其工作。方法头中包含 async 方法修饰符。包含一个或多个 await 表达式,表示可以异步完成的任务。必须具备3种返回类型之一:voidTaskTask<T>任何具有公开可访问的 GetAwaiter 方法的类型。异步方法的形参可以为任意类型、任意数量,但不能为 out 或 ref 参数。按照约定,异步方法的名称应该以 Async 为后缀。原创 2023-06-18 06:08:52 · 747 阅读 · 0 评论 -
(十)异步-什么是异步(1)
启动程序时,系统会在内存中创建一个新的进程。构成运行程序的资源的集合。这些资源包括虚地址空间、文件句柄和程序运行所需的其他许多东西。在进程内部,系统创建了一个称为线程的内核对象,它代表了真正执行的程序。(线程是“执行线程”的简称。)一旦进程建立,系统会在 Main 方法的第一行语句处开始线程的执行。默认情况下,一个进程只包含一个线程(主线程),从程序的开始一直执行到结束。线程可以派生其他线程(子线程),因此在任意时刻,一个进程都可能包含不同状态的多个线程,它们执行程序的不同部分。原创 2023-06-18 06:04:25 · 1555 阅读 · 0 评论 -
(九)枚举器和迭代器(2)
枚举器的迭代器模式......可枚举类型的迭代器模式......原创 2023-06-14 19:30:20 · 617 阅读 · 0 评论 -
(九)枚举器和迭代器(1)
枚举器都有 Current 和 MoveNext() 这两个公有成员,主要用来对数组或集合中改变下一个指向其某枚举对象(元素)的次序和位置,并重新获取 当前元素的值。也就是说,执行 foreach 语句遍历的行为,实际上是通过获取枚举器,然后枚举器对可枚举类型进行反复操作处理的行为。复习完了数组之后,由于数组遍历的这个行为,跟枚举器有很大的相关性,所以接下来继续要学习与枚举器相关的内容。目前调试的代码有三种枚举器类型,由于我不是很了解枚举器,所以不清楚除了这三种类型外,还有哪些其他类型。原创 2023-06-14 19:25:55 · 709 阅读 · 0 评论 -
(九)CSharp-数组
在某些情况下,即使某个对象不是数组的基类型,也可以把它赋值给数组元素。这种属性叫作数组协变。它们可以从基类继承很多有用的属性和方法。在 CIL中(中间语言),存在对一维数组进行性能优化的指令,而矩形数组没有这些指令。表总结了3种类型的数组的重要相似点和不同点——比较数组类型的总结。Clone 方法为数组进行浅复制,它只创建了数组本身的克隆。交错数组是数组的数组。交错数组的子数组的元素个数。不能在声明语句中初始化顶层数组之外的数组。由于迭代变量的值是只读的,所以它不能改变。原创 2023-06-14 19:18:13 · 808 阅读 · 0 评论 -
(八)CSharp-泛型协变和逆变(3)
当两个类对象是继承与派生的关系时,由于编译器通过泛型实例化时没法确认它们之间的关系,导致派生类对象不能赋值给基类对象。(发生在没有为对象的类型赋值的时候)当泛型接口或泛型委托实例化两个对象时(基类对象和派生类对象),通过协变和逆变的方式,来解决一个对象不能赋值给另一个对象的问题。但是对于泛型委托就不一样了,赋值原则虽成立,但是编译器会报错,因为派生类型委托没有从基类型委托派生。每一个变量都有一种类型,你可以将派生类型的对象赋值给基类型的变量,这叫作赋值兼容性。协变和逆变可以应用到委托上,也可以适用于接口。原创 2023-06-11 14:50:15 · 1187 阅读 · 0 评论 -
(八)CSharp-泛型中的方法结构委托接口(2)
泛型接口的声明和非泛型接口的声明差不多,但是需要在接口名称之后的尖括号中放置类型参数。实现泛型类型接口时,必须保证类型实参的组合不会在类型中产生两个重复的接口。编译可以从方法参数中推断类型参数,我们可以省略类型参数和调用中的尖括号。与泛型类相似,泛型结构可以有类型参数和约束。(规则和条件跟泛型类一样)泛型委托和非泛型委托相似,不过类型参数决定了能接受什么样的方法。泛型方法可以在泛型和非泛型类以及结构和接口中声明。泛型方法具有类型参数列表和可选的约束。委托形参列表和类型参数列表。泛型方法有两个参数列表。原创 2023-06-11 14:48:22 · 588 阅读 · 0 评论 -
(八)CSharp-泛型类和参数约束(1)
如果泛型里有 Object 成员,那么这个Object 成员是已知的类型,可以对它做一些如 ToSting、Equals 以及 GetType 方法的处理。而如果其他未知类型的成员不能像 Object 成员那样可以直接处理的,是未绑定的类型参数。由于泛型不知道它们保存的项的类型是什么,也就不会知道这些类型实现的成员,就不会对这些成员进行运算符的事情。(即类型实例化的代码在使用泛型时,不会进行拷贝这些实例化的代码)。泛型可以定义一次,就可以用于不同类型的实例化。泛型类型不是类型,而是类型的模板。原创 2023-06-11 14:46:16 · 858 阅读 · 0 评论 -
(七)CSharp-CSharp图解教程版-事件
同时,事件还起到因隐藏对委托字段的访问限制作用,仅仅提供添加和移除事件处理程序的功能。于是事件作为发送者的成员,发送者调用它就不会对委托里所有功能都能操作,因为委托在事件里是私有的。(如果一个处理程序多次重复了注册事件,移除时,只移除最后一个相同的处理程序实例,而其他相同的事件处理程序仍然可被回调。很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知。所以如果自定义一个委托,这时仅仅是一个委托,而不是事件,但也可以输出同样的结果。移除事件注册后,不触发事件。原创 2023-06-10 22:03:03 · 1831 阅读 · 0 评论 -
(七)CSharp-刘铁锰版-事件
事件的功能 = 通知 + 可选的事件参数(即详细信息)用于对象或类间的动作协调与信息传递(消息传递)事件模型(event model)中的两个“5。定义:单词 Event ,译为“事件”原创 2023-06-10 21:57:12 · 572 阅读 · 0 评论 -
(六)CSharp-CSharp图解教程版-委托
委托和类一样,是一种用户定义类型(即是一种类,所以也是一个引用类型在它们组成的结构方面区别是,类表示的是数据和方法的集合,而委托则持有一个或多个方法。可以把 delegate 看作是一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。(1)方法的列表称为调用列表。委托的返回类型;委托的签名(包括 ref 和 out 修饰符)(3)调用列表中的方法可以是实例方法也可以是静态方法。(4)在调用委托的时候,会执行其调用列表中的所有方法。委托也可以包含多个方法。也称为多播委托。原创 2023-06-09 19:37:56 · 2254 阅读 · 0 评论 -
(六)CSharp-刘铁锰版-委托
委托是一种类(class),类是数据类型所以委托也是一种数据类型(引用类型)它的声明方式与一般的类不同,主要是为了照顾可读性和 C/C++ 传统注意声明委托的位置避免写错地方结果声明成嵌套类型(在类里,声明委托属于嵌套)委托与所封装的方法必需“类型兼容”- 返回值的数据类型一致- 参数列表在个数和数据类型上一致(参数名不需要一样)原创 2023-06-09 19:32:35 · 1305 阅读 · 0 评论 -
(五)CSharp-进一步理解接口
接口是指定一组函数成员而不实现它们的引用类型。只能由类和结构来实现接口。原创 2023-06-09 19:30:30 · 978 阅读 · 0 评论 -
(五)CSharp-接口
接口定义既不能有构造函数,也不能有字段。接口定义不允许包含运算符重载接口定义不能声明关于成员的修饰符,(接口成员总是公有的)接口不能声明为虚拟或静态。C# 支持多接口继承和单一实现继承假定编写代码,最终允许在银行账户之间进行计算机转账业务。许多公司可以实现银行账户,但它们一致认为,表示银行账户的所有类都实现接口 IBankAccount。该接口包含一个用于存取款的方法和一个返回余额的属性。这个接口还允许外部代码识别由不同银行账户实现的各种银行账户类。原创 2023-06-08 18:32:35 · 1678 阅读 · 0 评论 -
(五)CSharp-继承
把一个基类函数声明为 virtual,就可以在任何派生类中重写该函数。//虚方法//虚属性//使用 override 来 重写虚方法从结果可知,派生类转换为基类,其结果仍是调用派生类重写的虚方法。原创 2023-06-08 18:30:18 · 889 阅读 · 0 评论 -
(五)CSharp-结构
使用类的这种方式来封装数据和功能,在性能方面会有一些损失。(由于托管堆的优化,性能损失比较小)如果有时只需要一个小的数据结构,不需要类的全部功能,最好使用结构。所以,结构主要用于小的数据结构。get结构存储在栈中或存储为内联(inline)(如果它们是存储在堆中的另一个对象的一部分。注:书中此处是不是说引用类型对象中的一部分是结构?结构不支持继承。对于结构,构造函数的工作方式有些区别。尤其是编译器总是提供一个无参数的默认构造函数,它是不允许替换的。原创 2023-06-08 18:30:14 · 1448 阅读 · 0 评论 -
(五)CSharp-类
程序的数据和功能被组织为逻辑上相关的数据项和函数的封装集合,并称为类。类是一个能存储数据并执行代码的数据结构。它包含数据成员和函数成员。表-类成员的类型数据成员存储数据函数成员执行代码字段、常量方法、属性、构造函数、析构函数 运算符、索引器、事件//显式和隐式字段初始化int F1;//初始化为 0 - 值类型string F2;//初始化为 null - 引用类型//初始化为 25//初始化为 “abcd”原创 2023-06-08 18:26:38 · 1296 阅读 · 0 评论 -
(二)CSharp-关于内存分配的总结和疑惑(未解决)
同时看了好几本书,对变量的内存分配概念总是稀里糊涂的。所以干脆专门写一篇文章来对C#内存分配进行研究和总结。原创 2023-06-07 19:43:06 · 832 阅读 · 0 评论 -
(三)CSharp-扩展方法
首先我们调用这个方法的时候,编译器第一个找的地方就是实例方法,如果没有找到这个实例方法,编译器就会自动找扩展方法。3.若要使用不同命名空间内的扩展方法,记得要加上命名空间声明(使用using),否则编译器会找不到扩展方法的类。扩展方法使你能够向现有类型“添加”方法,而无需创建新的派生类型、重新编译或以其他方式修改原始类型。1.如果扩展方法与该类型中定义的方法具有相同的签名,则扩展方法永远不会被调用。4、在调用代码中,添加 using 指令,用于指定包含扩展方法类的命名空间。原创 2023-06-06 20:39:14 · 475 阅读 · 0 评论 -
(三)CSharp-方法
同样的代码,在编译器里也是报错的。并且,在网上没有查到更多相关的资料。(微软开发文档也没有找到)不过也看到有些网友实现 了rerurn ref 的例子。相反,它将与该变量及该变量的操作有关的所有信息打包。在运行时,会对这些信息进行检查,以确保它与变量所代表的实际类型一致。在调用方法的时候,内存从栈的顶部开始分配,保存和方法关联的一些数据项,这块内存叫作方法的栈帧(stack frame)。使用值参数时,通过将实参的值复制到形参的方式把数据传递给方法。参数以不同的方式从方法传入或传出数据,称为值参数。原创 2023-06-06 20:38:32 · 638 阅读 · 0 评论 -
(二)CSharp-索引器
什么是索引器索引器(indexer)是这样一种成员:它使对象能够用与数组相同的方式(即使用下标)进行索引索引器的声明参见 C# 语言定义文档注意:没有静态索引器和属性一样,索引器不用分配内存来存储。索引器和属性都主要来访问其他数据成员,它们与这些成员关联,并为它们提供获取和设置访问。属性通常表示单个数据成员。索引器通常表示多个数据成员。索引器总是实例成员,因此不能被声明为 static。索引器的索引值(Index)类型不受限制索引器允许重载索引器不是一个变量。原创 2023-06-06 20:32:17 · 1028 阅读 · 0 评论 -
(二)CSharp-字段-属性-常量
【1】属性(property)是一种用于访问对象或类型的特征的成员,特征反映了状态【2】属性是字段的自然扩展1)从命名上看,field 更偏向于实例对象在内存中的布局,property 更偏向于反映现实世界对象的特征2)暴露数据,数据可以是存储在字段里的,也可以是动态计算出来的3)保护字段不被非法值“污染”trysetelse【3】属性由 Get/Set 方法对进化而来【4】又一个“语法糖”——属性背后的秘密什么是常量。原创 2023-06-06 20:30:20 · 1149 阅读 · 0 评论 -
(二)CSharp-值类型和引用类型
这两种类型的对象在内存种的存储方式不同。C# 中的值类型和引用类型。图-非成员数据的存储。原创 2023-06-06 20:29:28 · 127 阅读 · 0 评论 -
(二)CSharp-数据类型
11 种数值类型1)不同长度的有符号和无符号整数类型。2)浮点数类型 float 和 double。3)一种称为 decimal 的高精度小数类型。与 float 和 double 不同,decimal 类型可以准确地表示分数。decimal 类型常用于货币的计算。一种 Unicode 字符类型 char。一种布尔类型 bool。string,它是一个 Unicode 字符数组。object,它是所有其他类型的基类。dynamic,使用动态语言编写的程序集时使用。原创 2023-06-06 20:27:05 · 1233 阅读 · 0 评论 -
(二)CSharp-内存
虽然程序可以在堆里保存数据,但并不是显示地删除它们。CLR 的自动垃圾收集器在判断出程序的代码将不会再访问某数据项时,会自动清除无主的堆对象。堆是一块内存区域,在堆里可以分配大块的内存用于存储某种类型的数据对象。与栈不同,堆里的内存能够以任意顺序存入和移除。栈是一个内存数组,是一个LIFO(后进先出)的数据结构。原创 2023-06-06 20:20:49 · 71 阅读 · 0 评论 -
(一)CSharp-Net框架
CLS(公共语言规范)详细说明了一个 .NET 兼容编程语言的规则、属性和行为,其主题包括数据类型、类结构和参数传递。:不在 CLR 控制之下执行的代码,比如 Win32 C/C++ DLL,称为非托管代码。:为.NET 框架编写的代码称为托管代码,需要CLR。3.公共语言运行库(CLR)2.基类库(BCL).原创 2023-06-06 20:16:06 · 731 阅读 · 0 评论