七月 5

WPF编程中Property和Attribute的区别

在中文中,Property和Attribute都被翻译为属性。但是这两个单词真的是一个意思吗?今天,我们就来比较一下在WPF中这两个定义的区别.

Property属于面向对象理论范畴。在使用面向对象思想编程的时候,常常需要对客观事物进行抽象,再把抽象出来的结果封装成类,类中用来表示事物状态的成员就是Property。比如要写一个模拟赛车的游戏,那么必不可少的就是对现实汽车的抽象。现实中的汽车身上会带有很多数据,但在游戏中可能只关心它的长度、宽度、高度、重量、速度等有限的几个数据,同时,还会把汽车“加速”、“减速”等一些行为也提取出来并用算法模拟,这个过程就是抽象(结果是Car这个类)。显然,Car.Length、Car.Height、Car.Speed等表达的是汽车当前处在一个什么状态,而Car.Accelerate()、Car.Break()这些则是表达的是汽车能做什么。因此,Car.Length、Car.Height、Car.Speed就是Property的典型代表,将Property译为“属性”也很贴切。总结一句话就是:Property(属性)是针对对象而言的。

Attribute则是编程语言文法层面的东西。比如有两个同类的语法元素A和B,为了表示A与B不完全相同或者A与B在用法上有些区别,这时候就要针对A和B加一些Attribute。也就是说,Attribute只与语言层面上的东西相关,与抽象出来的对象没什么关系。因为Attribute是为了表示“区分”的,所以把它译为“特征”。C#中的Atribute就是这种应用的典型例子,我们可以为一个类添加Attribute,这个类的类成员中有很多Property。显然Attribute只是用来影响类在程序中的用法,而Property则对应着抽象对象身上的性状,它们根本不是一个层面上的东西。

习惯上,英文中把标签式语言中表示一个标签特征的“名称-值”对称作Attribute。如果恰好又是用一种标签语言在进行面向对象编程,这时候两个概念就有可能混淆在一起了。实际上,使用能够进行面向对象编程的标签式语言只是把标签与对象做了一个映射,同时把标签的Attribute与对象的Property也做了一个映射针对标签还是叫Attribute,针对对象还是叫Property,仍然不是一个层面上的东西。而且,标签的Attribute与对象的Property.也不是完全映射的,往往是一个标签所具有的Attribute多于它所代表的对象的Property。

因为XAML是用来在UI上绘制控件的,而控件本身就是面向对象抽象的产物,所以XAML标签的Attribute里就有一大部分是与控件对象的Property互相对应的。当然,这还意味着XAML标签还有一些Attribute并不对应控件对象的Property。

如果上面的解释您还不够明白,可以这样理解:针对标签的属性就是Attribute,针对类的的属性就是Property。他们直接有些地方是一样的,但并不是完全对应的。

七月 2

WPF笔记之XAML基础笔记

  1. XAML中只能有一个顶级元素。常用的顶级元素:Window,Page,Application。
  2. XAML中有属性和事件。其中附加属性指的是调用别的类的属性。例如,我们设置某个按键所属于的Grid的RowDefinition。此处的Grid.Row虽然是Grid的属性,然而我们却需要在Button中进行定义。这样的属性就叫做附加属性。
  3. 属性的定义可以直接定义,也可以通过属性元素定义。一般只有比较复杂的情况下才选择属性元素的方法定义。直接定义更加简单直观。
  4. 在XAML中小于号<用&lt表示(个人估计lt的意思是less than),类似,在XAML中大于号>用&gt表示(估计gt是greater than的意思)。
  5. XAML中无论几个空格都会自动识别为一个。如果想要保留原来的空格数量,需要设置属性xml:space = "preserve"。
一月 16

C#中如何将字符串string转换成枚举类型 – typeof()以及Enum.Parse()的用法

在C#中,我们有时会需要将字符串类型转换成枚举类型。此时我们无法使用显示转换,只能使用隐式转换。而我们需要用到的,就是Enum.Parse()方法。以下是这个方法的一个例子:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
//声明枚举类型
enum orientation : byte
{
north = 1,
south = 2,
east = 3,
west = 4
}
class Program
{
static void Main(string[] args)
{
//枚举使用一个基本类型来存储,枚举类型可以提取的每个值都存储为该基本类型的一个值,默认情况下该类型为int;
//枚举的基本类型可以是byte,sbyte,short,ushort,int,uint,long,ulong;
//调用枚举类型
orientation myDirection = orientation.north;
Console.WriteLine("myDirection={0}",myDirection);

//将string类型转换为枚举类型,typeof(orientation)将得到orientation的类型,Parse()将进行类型转换;
string myString = "north";
orientation myDirection2 = (orientation)Enum.Parse(typeof(orientation), myString);
Console.WriteLine("myDirection2={0}", myDirection2);
Console.ReadLine();
}
}
}

在这里需要注意的是,有一个typeof方法,这个方法返回的是数值的类型。要注意,枚举不是一个单独的类型,而使用枚举定义的特定枚举类型才是类型。

十二月 30

C#中的数据类型转换

  • String转换成其他数据类型

string strNumber = "18";

int num1 = int.Parse(strNumber);

float num2 = float.Parse(strNumber);

  • ToString转换:任意类型转换为String类型

int number = 18;

string str = number.ToString();

  • 隐式转换:自动转换

byte b = 100;

int i = b;

  • 显式转换:强制转换

int i = 100;

byte b = (byte)i;

  • 多种类型变量参与的运算,会产生类型提升

其中的一方为long,则结果为long

其中的一方为float,则结果为float

其中的一方为double,则结果为double

其中的一方为decimal,则结果为decimal

其余运算结果为int

注意,快捷运算符(例如+=),不会产生类型提升

(未完待续)

 

 

十月 15

C#中在字符串前加@的作用

我们经常可以在C#代码中看到某个字符串前面加上了@符号,尤其是那些表示文件位置路径的字符串。那么@符号在C#中究竟表示什么呢?

其实答案非常简单,将@放在字符串前面,字符串当中的转义字符将不再被转义,而是直接被输出出来。

但是这和表示文件位置的路径有什么关系呢?答案很简单,因为路径当中存在大量的‘\’字符,而这个字符正是表示转义字符的。因此我们在表示文件路径是不得不适用\\来间隔路径的不同层级,这就使得我们不能非常方便的复制粘贴路径,也使得路径文件可读性变得较低。而在文件路径字符串前面加一个@就可以很好的解决这个问题了。

例:

string path = "C:\\Program Files\\Common\\Intel";

string path = @"C:\Program Files\Common\Intel"

这两个字符串都可以表示文件路径,只不过一个用了转义字符,另外一个用了@的用法。

另外,当我们在字符串前面加了@之后,就可以把字符串定义在多行了。之前我们只能把字符串定义在当前行。

最后需要提醒大家注意的是,在加了@字符串中如果我们需要表示",那我们需要输入"",也就是两个双引号才能输出一个双引号。

例:

string path = @"I want to put "" in my output";

如果输出字符串,输出结果将会是:I want to put " in my output

十月 15

C#中数据类型的知识点整理

本次整理仅整理本人觉得易错的知识点,所以不是非常全面。

  1. 整形数据从短到长分别为:sbyte,byte < short, ushort < int, uint < long, ulong。其中sbyte表示有符号的,byte表示无符号的。其他的是整数数据类型,short,int,long均表示有符号的,而前面加上u则表示无符号的。
  2. 浮点型数据从短到长分别为:float < double < decimal。
  3. 当我们在C#中定义浮点数时,默认为double精度。如果我们要定义一个float精度的数据,需要在浮点数后面加上一个f。例如:float myFloat = 12.5f;
  4. 字符用单引号,字符串用双引号。
  5. 布尔类型的true和false都是小写的。但是输出的时候会变成大写。
十月 14

C#中如何格式化字符串

当我们使用Write()和WriteLine()方法输出的时候,可以对字符串进行格式化输出。

例:Console.WriteLine("两个数相加{0}+{1}={2}.", 1, 2, 3);

输出结果:两个数相加1+2=3.

上面的内容说明,我们在执行代码的时候,把标记替换为了对应的值。标记是从{0}开始的,而且不能超出后面对应索引的值。否则会报错。

标准数字字符串格式化:

  • Console.WriteLine("金额:{0:c}", 10); //输出货币¥10.00
  • Console.WriteLine("{0:d2}", 5); //输出05,整形永远输出两位
  • Console.WriteLine("{0:f1}", 1.26); //输出1.3,浮点型精度设置
  • Console.WriteLine("{0:p1}", 0.1); //输出10.0%,保留1位小数。
十月 14

C#中的标识符

标识符是一种字符串,用来命名变量,方法,参数,程序结构等。

C#中标识符命名规则:

  1. 数字不能放在首位
  2. @字符只能放在标识符的首位
  3. 字母,下划线可以用在任何位置
  4. 标识符不能和关键字重名

C#中标识符的命名规范:

Camel命名法:首个单词首字母小写,其他单词的首字母大写。

Pascal命名法:所有单词的第一个字母全都大写。

变量使用Camel命名法,方法和类使用Pascal命名法。

关键字:用来定义C#语言的字符串记号。例如namespace,class等。

十月 14

使用Visual Studio快速编写代码的小技巧

快捷键

Home:把光标定位在当前行的最前方

End:把光标定位在当前行的最后方

PageUp:对文档向上翻页

PageDown:对文档向下翻页

Ctrl + Z:撤销操作

Ctrl + A:全选

Ctrl + S:保存

Ctrl + X:剪切

Ctrl + C:复制

Ctrl + V:粘贴

Ctrl + Home:跳到当前代码的开头

Ctrl + End:跳到当前代码的结尾

F5:运行当前代码

Ctrl + F5:运行当前代码并等待进一步操作。

Del:删除光标后的内容

Backspace:删除光标前的内容

Ins:插入模式和覆盖模式切换

输入的时候记得使用英文半角字符

十月 14

第一个C#程序结构分析

//在C#中表示注释。

using System; - 这一类代码的作用是引入命名空间。灰色的引入命名空间说明该命名空间下的内容我们没有用到。而亮色的引入命名空间则说明该命名空间下的内容我们用到了。

namespace :定义命名空间

class:定义类

static void Main:定义Main方法。Main方法是一个特殊的方法。可以认为是整个程序的入口。一个项目中会有很多的类,但是Main方法有且只有一个。方法内部的内容被称为方法体。

命名空间,类,以及方法的内容都放在大括号{}内。