惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

酷 壳 – CoolShell
酷 壳 – CoolShell
H
Hacker News: Front Page
P
Palo Alto Networks Blog
T
ThreatConnect
Apple Machine Learning Research
Apple Machine Learning Research
博客园_首页
T
True Tiger Recordings
P
Privacy & Cybersecurity Law Blog
B
Blog
IT之家
IT之家
Last Week in AI
Last Week in AI
F
Full Disclosure
Hacker News: Ask HN
Hacker News: Ask HN
C
Comments on: Blog
Microsoft Azure Blog
Microsoft Azure Blog
C
Cybersecurity and Infrastructure Security Agency CISA
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
N
News and Events Feed by Topic
NISL@THU
NISL@THU
腾讯CDC
雷峰网
雷峰网
Security Latest
Security Latest
李成银的技术随笔
M
Microsoft Research Blog - Microsoft Research
L
LangChain Blog
L
Lohrmann on Cybersecurity
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Check Point Blog
Y
Y Combinator Blog
Recent Announcements
Recent Announcements
博客园 - Franky
N
News | PayPal Newsroom
V
V2EX
A
About on SuperTechFans
The Register - Security
The Register - Security
月光博客
月光博客
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Google Online Security Blog
Google Online Security Blog
MyScale Blog
MyScale Blog
Cisco Talos Blog
Cisco Talos Blog
Vercel News
Vercel News
WordPress大学
WordPress大学
C
Cyber Attacks, Cyber Crime and Cyber Security
The Hacker News
The Hacker News
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
IntelliJ IDEA : IntelliJ IDEA – the Leading IDE for Professional Development in Java and Kotlin | The JetBrains Blog
爱范儿
爱范儿
A
Arctic Wolf
L
LINUX DO - 最新话题
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More

博客园 - 小肠与小豆子

博客园MetaWeblog使用帮助 [ASP.NET 1.1]Global.asax.cs中的方法的含义 Microsoft .NET Pet Shop 4 架构与技术分析 转载:键盘模拟鼠标(实现用键盘操作鼠标光标)(示例代码下载) 转载:Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载) 转载:Asp.net 2.0 用C# 创建 PDF文件[引用] (示例代码下载) 转载:Asp.net 2.0 C#实现压缩/解压功能 (示例代码下载) 转载:ASP.NET 2.0 HttpHandler实现对某种文件类型权限保护 转载:asp.net千奇百怪的日历 转载:ASP.net 2.0资料吐血收藏 解决:此页正在访问其它域的数据…… sql server系统表详细说明 数据库设计方法、规范与技巧 (转自Blogcn的我的窝) 14个数据库的设计技巧 (来自Blogcn中我的窝) SQL 数据库中所有的用户表,一个表的中的所有列信息 的SQL 转载:汉字转拼音_gb2312 C# IIS状态一览表 IIS简介 IIS中的 MIME类型
C#中的一些常用属性
小肠与小豆子 · 2007-03-08 · via 博客园 - 小肠与小豆子

C#中一些默认的预定义属性,见下表:

预定义的属性

有效目标

说明

AttributeUsage

Class

指定另一个属性类的有效使用方式

CLSCompliant

全部

指出程序元素是否与CLS兼容

Conditional

Method

指出如果没有定义相关联的字符串,编译器就可以忽略对这个方法的任何调用

DllImport

Method

指定包含外部方法的实现的DLL位置

STAThread

Method(Main)

指出程序的默认线程模型为STA

MTAThread

Method(Main)

指出程序的默认模型为多线程(MTA)

Obsolete

除了Assembly、Module、Parameter和Return

将一个元素标示为不可用,通知用户此元素将被从未来的产品

ParamArray

Parameter

允许单个参数被隐式地当作params(数组)参数对待

Serializable

Class、Struct、enum、delegate

指定这种类型的所有公共和私有字段可以被串行化

NonSerialized

Field

应用于被标示为可串行化的类的字段,指出这些字段将不可被串行化

StructLayout

Class、struct

指定类或结构的数据布局的性质,比如Auto、Explicit或sequential

ThreadStatic

Field(静态)

实现线程局部存储(TLS)。不能跨多个线程共享给定的静态字段,每个线程拥有这个静态字段的副本

下面介绍几种常用的属性

1.[STAThread]和[MTAThread]属性

class Class1

{

        [STAThread]

        Static void Main( string[] args )

        {

        }

}

使用STAThread属性将程序的默认线程模型指定为单线程模型。注意,线程模型只影响使用COM interop的应用程序,将这个属性应用于不使用COM interop的程序将不会产生任何效果。

2. AttributeUsage属性

        除了用于标注常规C#类型的自定义属性以外,还可以使用AttributeUsage属性定义你使用这些属性的方式。文件记录的AttributeUsage属性调用用法如下:

[AttributeUsage( validon , AllowMutiple = allowmutiple , Inherited = inherited )]

Validon参数是AttributeTargets类型的,这个枚举值的定义如下:

public enum AttributeTargets

{

        Assembly = 0x0001,

        Module = 0x0002,

        Class = 0x0004,

        Struct = 0x0008,

        Enum = 0x0010,

        Constructor = 0x0020,

        Method = 0x0040,

        Property = 0x0080,

        Field = 0x0100,

        Event = 0x200,

        Interface = 0x400,

        Parameter = 0x800,

        Delegate = 0x1000,

        All = Assembly | Module | Class | Struct | Enum | Constructor| Method | Property|                    Filed| Event| Interface | Parameter | Deleagte ,

        ClassMembers = | Class | Struct | Enum | Constructor | Method | Property | Field |                    Event | Delegate | Interface

}

AllowMultiple决定了可以在单个字段上使用某个属性多少次,在默认情况下,所有的属性都是单次使用的。示例如下:

[AttributeUsage( AttributeTargets.All , AllowMultiple = true )]

public class SomethingAttribute : Attribute

{

        public SomethingAttribute( string str )

        {

        }

}

//如果AllowMultiple = false , 此处会报错

[Something(“abc”)]

[Something(“def”)]

class Myclass

{

}

Inherited参数是继承的标志,它指出属性是否可以被继承。默认是false。

Inherited

AllowMultiple

结果

true

false

派生的属性覆盖基属性

true

false

派生的属性和基属性共存

代码示例:

using System;

using System.Reflection;

namespace AttribInheritance

{

     [AttributeUsage(

          AttributeTargets.All,

          AllowMultiple=true,

//       AllowMultiple=false,

          Inherited=true

     )]

     public class SomethingAttribute : Attribute

     {

         private string name;

         public string Name

         {

              get { return name; }

              set { name = value; }

         }

         public SomethingAttribute(string str)

         {

              this.name = str;

         }

     }

     [Something("abc")]

     class MyClass

     {

     }

     [Something("def")]

     class Another : MyClass

     {

     }

     class Test

     {

         [STAThread]

         static void Main(string[] args)

         {

              Type type =

                  Type.GetType("AttribInheritance.Another");

              foreach (Attribute attr in

                  type.GetCustomAttributes(true))

//                type.GetCustomAttributes(false))

              {

                  SomethingAttribute sa =

                       attr as SomethingAttribute;

                  if (null != sa)

                  {

                  Console.WriteLine(

                           "Custom Attribute: {0}",

                           sa.Name);

                  }

              }

         }

     }

}

当AllowMultiple被设置为false时,结果为:

Custom Attribute : def

当AllowMultiple被设置为true时,结果为:

Custom Attribute : def

Custom Attribute : abc

注意,如果将false传递给GetCustomAttributes,它不会搜索继承树,所以你只能得到派生的类属性。

3.Conditional 属性

        你可以将这个属性附着于方法,这样当编译器遇到对这个方法调用时,如果没有定义对应的字符串值,编译器就忽略这个调用。例如,以下方法是否被编译取决于是否定义了字符串“DEGUG”:

[Condition(“DEBUG”) ]

public void SomeDebugFunc()

{

        Console.WriteLine(“SomeDebugFunc”);

}

using System;

using System.Diagnostics;

namespace CondAttrib

{

     class Thing

     {

         private string name;

         public Thing(string name)

         {

              this.name = name;

              #if DEBUG

                  SomeDebugFunc();

              #else

                  SomeFunc();

              #endif

         }

         public void SomeFunc()

              { Console.WriteLine("SomeFunc"); }

         [Conditional("DEBUG")]

         [Conditional("ANDREW")]

         public void SomeDebugFunc()

              { Console.WriteLine("SomeDebugFunc"); }

     }

     public class Class1

     {

         [STAThread]

         static void Main(string[] args)

         {

              Thing t = new Thing("T1");

         }

     }

}

4. Obsolete 属性

        随着代码不断的发展,你很可以会有一些方法不用。可以将它们都删除,但是有时给它们加上适当的标注比删除它们更合适,例如:

using System;

namespace ObsAttrib

{

     class SomeClass

     {

         [Obsolete("Don't use OldFunc, use NewFunc instead", true)]

         public void OldFunc( ) { Console.WriteLine("Oops"); }

         public void NewFunc( ) { Console.WriteLine("Cool"); }

     }

     class Class1

     {

         [STAThread]

         static void Main(string[] args)

         {

              SomeClass sc = new SomeClass();

              sc.NewFunc();

//            sc.OldFunc();     // compiler error

         }

     }

}

我们将Obsolete属性的第二个参数设置为true,当调用时函数时编译器会产生一个错误。

E:\InsideC#\Code\Chap06\ObsAttrib\ObsAttrib\Class1.cs(20): 'ObsAttrib.SomeClass.OldFunc()' 已过时: 'Don't use OldFunc, use NewFunc instead'

5. DllImport和StructLayout属性

        DllImport可以让C#代码调用本机代码中的函数,C#代码通过平台调用(platform invoke)这个运行时功能调用它们。

        如果你希望运行时环境将结构从托管代码正确地编组现非托管代码(或相反),那么需要为结构的声明附加属性。为了使结构参数可以被正确的编组,必须使用StructLayout属性声明它们,指出数据应该严格地按照声明中列出的样子进行布局。如果不这么做,数据将不能正确地被编组,而应用程序可能会出错。

using System;

using System.Runtime.InteropServices;    // for DllImport

namespace nativeDLL

{

     public class Test

     {

//       [DllImport ("user32.dll")]           // all the defaults are OK

         [DllImport("user32", EntryPoint="MessageBoxA",

              SetLastError=true,

              CharSet=CharSet.Ansi, ExactSpelling=true,

              CallingConvention=CallingConvention.StdCall)]

         public static extern int MessageBoxA (

              int h, string m, string c, int type);

         [StructLayout(LayoutKind.Sequential)]

         public class SystemTime {

              public ushort wYear;

              public ushort wMonth;

              public ushort wDayOfWeek;

              public ushort wDay;

              public ushort wHour;

              public ushort wMinute;

              public ushort wSecond;

              public ushort wMilliseconds;

         }

         [DllImport ("kernel32.dll")]

         public static extern void GetLocalTime(SystemTime st);

         [STAThread]

         public static void Main(string[] args)

         {

              MessageBoxA(0, "Hello World", "nativeDLL", 0);

              SystemTime st = new SystemTime();

              GetLocalTime(st);

              string s = String.Format("date: {0}-{1}-{2}",

                  st.wMonth, st.wDay, st.wYear);

              string t = String.Format("time: {0}:{1}:{2}",

                  st.wHour, st.wMinute, st.wSecond);

              string u = s + ", " + t;

              MessageBoxA(0, u, "Now", 0);

         }

     }

}

6. 配件属性

        当使用.NET产生任何类型的C#工程时,会自动的产生一个AssemblyInfo.cs源代码文件以及应用程序源代码文件。AssemblyInfo.cs中含有配件中代码的信息。其中的一些信息纯粹是信息,而其它信息使运行时环境可以确保惟一的命名和版本号,以供重用你的配件的客户代码使用。

7. 上下文属性

        .NET柜架还提供了另一种属性:上下文属性。上下文属性提供了一种截取机制,可以在类的实例化和方法调用之前和之后进行处理。这种功能用于对象远程调用,它是从基于COM的系统所用的COM+组件服务和Microsoft Transaction Services(MTS)。