C#中的一些细节

localhost与127.0.0.1的区别

127.0.0.1是一个回送地址,指本地机,一般用来测试使用。大家常用来ping 127.0.0.1来看本地ip/tcp正不正常,如能ping通即可正常使用。

对于大多数习惯用localhost的来说,实质上就是指向127.0.0.1这个本地IP地址。在操作系统中有个配置文件将localhost与127.0.0.1绑定在了一起。可以理解为本地主机的意思。

localhost与127.0.0.1的区别是什么?

localhost也叫local ,正确的解释是:本地服务器

127.0.0.1在windows等系统的正确解释是:本机地址(本机服务器)

他们的解析通过本机的host文件,windows自动将localhost解析为127.0.0.1

localhot(local)是不经网卡传输!这点很重要,它不受网络防火墙和网卡相关的的限制。

127.0.0.1是通过网卡传输,依赖网卡,并受到网络防火墙和网卡相关的限制。

一般设置程序时本地服务用localhost是最好的,localhost不会解析成ip,也不会占用网卡、网络资源。localhost访问时,系统带的本机当前用户的权限去访问,而用ip的时候,等于本机是通过网络再去访问本机,可能涉及到网络用户的权限。有时候用localhost可以,但用127.0.0.1就不可以的情况就是在于此。

C#中null与string.Empty和""的区别

在 C# 中,大多数情况下 "" 和 string.Empty 可以互换使用。比如:


代码如下


复制代码


string s = "";
string s2 = string.Empty;

if (s == string.Empty) {
  // 判定条件为true

}

判定为空字符串的几种写法,按照性能从高到低的顺序是:


代码如下


复制代码


s.Length ==
0      优于 s ==
string.Empty      优于 s ==
""

String.Empty和Null这两个都是表示空字符串,定义 string str1= String.Empty和 string
str2=null 的区别, str1是一个空字符串(它实际是等价于string str1 = null; str1 = "";),空字符串是一个特殊的字符串,只不过这个字符串的值为空,在内存中是有准确的指向的, str2只是定义了一个string 类的引用,str2并没有指向任何地方,在使用前如果不实例化的话,将报错。

UI控件方面,TextBox 空白时,TextBox.Text的值为零长度字符串 ""。

C#日期格式化


日期转化

 

DateTime
d t= DateTime.Now;



dt.ToString();


‘2005-11-5 
13:21:25


dt.ToFileTime().ToString();


‘127756416859912000


dt.ToFileTimeUtc().ToString();


127756704859912816


dt.ToLocalTime().ToString();


‘2005-11-5
21:21:25


dt.ToLongDateString().ToString();


‘2005-11-5


dt.ToLongTimeString().ToString();


‘13:21:25


dt.ToOADate().ToString();


‘38661.5565508218


dt.ToShortDateString().ToString();


‘2005-11-5


dt.ToShortTimeString().ToString();


‘13:21


dt.ToUniversalTime().ToString();


‘2005-11-5
5:21:25


dt.Year.ToString();


‘2005


dt.Date.ToString();


‘2005-11-5
0:00:00


dt.DayOfWeek.ToString();


‘Saturday


dt.DayOfYear.ToString();


‘309


dt.Hour.ToString();


‘13


dt.Millisecond.ToString();


‘441


dt.Minute.ToString();


‘30


dt.Month.ToString();


‘11


dt.Second.ToString();


‘28


dt.Ticks.ToString();


‘632667942284412864


dt.TimeOfDay.ToString();


‘13:30:28.4412864


dt.ToString();


‘2005-11-5
13:47:04


dt.AddYears(1).ToString();


‘2006-11-5
13:47:04


dt.AddDays(1.1).ToString();


‘2005-11-6
16:11:04


dt.AddHours(1.1).ToString();


‘2005-11-5
14:53:04


dt.AddMilliseconds(1.1).ToString();


‘2005-11-5
13:47:04


dt.AddMonths(1).ToString();


‘2005-12-5
13:47:04


dt.AddSeconds(1.1).ToString();


‘2005-11-5
13:47:05


dt.AddMinutes(1.1).ToString();


‘2005-11-5
13:48:10


dt.AddTicks(1000).ToString();


‘2005-11-5
13:47:04


dt.CompareTo(dt).ToString();


‘0


dt.Add(?).ToString();


‘问号为一个时间段


dt.Equals("2005-11-6
16:11:04").ToString();


‘False


dt.Equals(dt).ToString();


‘True


dt.GetHashCode().ToString();


‘1474088234


dt.GetType().ToString();


‘System.DateTime


dt.GetTypeCode().ToString();


‘DateTime


dt.GetDateTimeFormats(‘s‘)[0].ToString();


‘2005-11-05T14:06:25


dt.GetDateTimeFormats(‘t‘)[0].ToString();


‘14:06


dt.GetDateTimeFormats(‘y‘)[0].ToString();


‘2005年11月


dt.GetDateTimeFormats(‘D‘)[0].ToString();


‘2005年11月5日


dt.GetDateTimeFormats(‘D‘)[1].ToString();


‘2005
11 05


dt.GetDateTimeFormats(‘D‘)[2].ToString();


‘星期六
2005 11 05


dt.GetDateTimeFormats(‘D‘)[3].ToString();


‘星期六
2005年11月5日


dt.GetDateTimeFormats(‘M‘)[0].ToString();


‘11月5日


dt.GetDateTimeFormats(‘f‘)[0].ToString();


‘2005年11月5日
14:06


dt.GetDateTimeFormats(‘g‘)[0].ToString();


‘2005-11-5
14:06


dt.GetDateTimeFormats(‘r‘)[0].ToString();


‘Sat,
05 Nov 2005 14:06:25 GMT


string.Format("{0:d}",dt);


‘2005-11-5


string.Format("{0:D}",dt);


‘2005年11月5日


string.Format("{0:f}",dt);


‘2005年11月5日
14:23


string.Format("{0:F}",dt);


‘2005年11月5日
14:23:23


string.Format("{0:g}",dt);


‘2005-11-5
14:23


string.Format("{0:G}",dt);


‘2005-11-5
14:23:23


string.Format("{0:M}",dt);


‘11月5日


string.Format("{0:R}",dt);


‘Sat,
05 Nov 2005 14:23:23 GMT


string.Format("{0:s}",dt);


‘2005-11-05T14:23:23


string.Format("{0:t}",dt);


‘14:23


string.Format("{0:T}",dt);


‘14:23:23


string.Format("{0:u}",dt);


‘2005-11-05
14:23:23Z


string.Format("{0:U}",dt);


‘2005年11月5日
6:23:23


string.Format("{0:Y}",dt);


‘2005年11月


string.Format("{0}",dt);


‘2005-11-5
14:23:23

以下转自:http://www.cnblogs.com/akwwl/p/3240813.html

C#读写txt文件的两种方法介绍

1.添加命名空间

  System.IO;

  System.Text;

2.文件的读取

  (1).使用FileStream类进行文件的读取,并将它转换成char数组,然后输出。

        byte[] byData = new byte[100];
        char[] charData = new char[1000];
        public void Read()
        {
            try
            {
                FileStream file = new FileStream("E:\\test.txt", FileMode.Open);
                file.Seek(0, SeekOrigin.Begin);
                file.Read(byData, 0, 100); //byData传进来的字节数组,用以接受FileStream对象中的数据,第2个参数是字节数组中开始写入数据的位置,它通常是0,表示从数组的开端文件中向数组写数据,最后一个参数规定从文件读多少字符.
                Decoder d = Encoding.Default.GetDecoder();
                d.GetChars(byData, 0, byData.Length, charData, 0);
                Console.WriteLine(charData);
                file.Close();
            }
            catch (IOException e)
            {
                Console.WriteLine(e.ToString());
            }
        }
    

  (2).使用StreamReader读取文件,然后一行一行的输出。

    public void Read(string path)
        {
            StreamReader sr = new StreamReader(path,Encoding.Default);
            String line;
            while ((line = sr.ReadLine()) != null)
            {
                Console.WriteLine(line.ToString());
            }
        }

3.文件的写入
  (1).使用FileStream类创建文件,然后将数据写入到文件里。

        public void Write()
        {
            FileStream fs = new FileStream("E:\\ak.txt", FileMode.Create);
            //获得字节数组
            byte[] data = System.Text.Encoding.Default.GetBytes("Hello World!");
            //开始写入
            fs.Write(data, 0, data.Length);
            //清空缓冲区、关闭流
            fs.Flush();
            fs.Close();
        }

  (2).使用FileStream类创建文件,使用StreamWriter类,将数据写入到文件。

        public void Write(string path)
        {
            FileStream fs = new FileStream(path, FileMode.Create);
            StreamWriter sw = new StreamWriter(fs);
            //开始写入
            sw.Write("Hello World!!!!");
            //清空缓冲区
            sw.Flush();
            //关闭流
            sw.Close();
            fs.Close();
        }

  以上就完成了,txt文本文档的数据读取与写入。

[转]C#获取本机IP搜集整理7种方法

 1 private void GetIP()
 2 {
 3     string hostName = Dns.GetHostName();//本机名
 4     //System.Net.IPAddress[] addressList = Dns.GetHostByName(hostName).AddressList;//会警告GetHostByName()已过期,我运行时且只返回了一个IPv4的地址
 5     System.Net.IPAddress[] addressList = Dns.GetHostAddresses(hostName);//会返回所有地址,包括IPv4和IPv6
 6     foreach (IPAddress ip in addressList)
 7     {
 8         listBox1.Items.Add(ip.ToString());
 9     }
10 }  

②使用IPHostEntry获取本机局域网地址

1         static string GetLocalIp()
2         {
3             string hostname = Dns.GetHostName();//得到本机名
4             //IPHostEntry localhost = Dns.GetHostByName(hostname);//方法已过期,只得到IPv4的地址
5 <SPAN style="WHITE-SPACE: pre"> </SPAN>    IPHostEntry localhost = Dns.GetHostEntry(hostname);
6             IPAddress localaddr = localhost.AddressList[0];
7             return localaddr.ToString();
8         }  

方法时通过向网站向一些提供IP查询的网站发送webrequest,然后分析返回的数据流

 1        string strUrl = "提供IP查询的网站的链接";
 2        Uri uri = new Uri(strUrl);
 3        WebRequest webreq = WebRequest.Create(uri);
 4        Stream s = webreq .GetResponse().GetResponseStream();
 5        StreamReader sr = new StreamReader(s, Encoding.Default);
 6        string all = sr.ReadToEnd();
 7        int i = all.IndexOf("[") + 1;
 8        //分析字符串得到IP
 9        return ip;
10        /*
11         我用的是http://www.ip.cn/getip.php?action=getip&ip_url=&from=web
12         (这种链接很容易找的,百度“IP”得到一些网站,分析一下网站的链接就能得到)
13         返回的数据是:
14         <div class="well"><p>当前 IP:<code>0.0.0.0</code>&nbsp;来自:XX省XX市 电信</p><p>GeoIP: Beijing, China</p></div>
15         解析这段就行
16       */  

⑥通过获取CMD里ipconfig命令的结果来得到IP

 1    private void GetIP6()
 2    {
 3        Process cmd = new Process();
 4        cmd.StartInfo.FileName = "ipconfig.exe";//设置程序名
 5        cmd.StartInfo.Arguments = "/all";  //参数
 6 //重定向标准输出
 7        cmd.StartInfo.RedirectStandardOutput = true;
 8        cmd.StartInfo.RedirectStandardInput = true;
 9        cmd.StartInfo.UseShellExecute = false;
10        cmd.StartInfo.CreateNoWindow = true;//不显示窗口(控制台程序是黑屏)
11 //cmd.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;//暂时不明白什么意思
12        /*
13 收集一下 有备无患
14        关于:ProcessWindowStyle.Hidden隐藏后如何再显示?
15        hwndWin32Host = Win32Native.FindWindow(null, win32Exinfo.windowsName);
16        Win32Native.ShowWindow(hwndWin32Host, 1);     //先FindWindow找到窗口后再ShowWindow
17        */
18        cmd.Start();
19        string info = cmd.StandardOutput.ReadToEnd();
20        cmd.WaitForExit();
21        cmd.Close();
22        textBox1.AppendText(info);
23    }  

⑦NetworkInformation

以下转自:http://www.cnblogs.com/huashanlin/archive/2007/07/07/809305.html

[STAThread]的含义

Posted on 2007-07-07 10:06 桦林 阅读(32335) 评论(10) 编辑 收藏

[STAThread]
STAThread:Single     Thread     Apartment Thread.(单一线程单元线程)
[]是用来表示Attributes;

[STAThread]
是一种线程模型,用在程序的入口方法上(在C#和VB.NET里是Main()方法),来指定当前线程的ApartmentState 是STA。用在其他方法上不产生影响。在aspx页面上可以使用AspCompat = "true" 来达到同样的效果。这个属性只在  Com  Interop  有用,如果全部是  managed  code  则无用。简单的说法:[STAThread]指示应用程序的默认线程模型是单线程单元 (STA)。启动线程模型可设置为单线程单元或多线程单元。如果未对其进行设置,则该线程不被初始化。也就是说如果你用的.NET Framework,并且没有使用COM Interop,一般不需要这个Attribute。其它的还有MTA(多线程套间)、Free  Thread(自由线程)。

[STAThread] attribute指示应用程序的 COM 线程模型是单线程单元。
而于此对应的多线程单元则是 [MTAThread] (多线程单元线程)

COM 线程模型只适用于使用 COM interop 的应用程序。如果将此属性应用到不使用 COM interop 的应用程序,将没有任何效果。

COM 线程模型可设置为单线程单元或多线程单元。如果应用程序线程实际调用了 COM 组件,则仅为 COM interop 初始化该线程。如果没有使用 COM interop,则不初始化该线程。

以下是找到的一个资料介绍:
Q. When I create a c# project from scratch in VS.NET, the generated code always have a [STAThread] attribute above the main routine. What does the STAThread attribute really do? Can I change it to MTAThread instead? I have searched website and books, no one seems to explain this well.

Asked by anon. Answered by the Wonk on February 17, 2003

A.

The STAThreadAttribute marks a thread to use the Single-Threaded COM Apartment if COM is needed. By default, .NET won‘t initialize COM at all. It‘s only when COM is needed, like when a COM object or COM Control is created or when drag ‘n‘ drop is needed, that COM is initialized. When that happens, .NET calls the underlying CoInitializeEx function, which takes a flag indicating whether to join the thread to a multi-threaded or single-threaded apartment.

A multi-threaded apartment (MTA) in COM is more efficient, since any of a number of RPC threads from a pool can be used to handle a request. However, an object on the MTA thread needs to protect itself from multiple threads accessing it at the same time, so that efficiency comes at a cost.

The single-thread apartment (STA) in COM is inherently single-threaded and therefore no additional thread synchronization is needed. The STA is implemented using the thread‘s Windows message queue, which is how requests to objects on an STA are serialized. Because of how the STA thread is implemented, calls to objects on that thread are serialized with Windows message handling on that thread, making sure that everything, both the COM objects and the underlying windowing objects, e.g. HWNDs, are all synchronized. This is necessary for UI-oriented COM objects, like controls and drag ‘n‘ drop, which must also be synchronized together with the UI.

When COM is needed .NET will call CoInitializeEx, picking the MTA by default because it‘s more efficient. However, to get the synchronization needed for controls, windows and drag ‘n‘ drop, you need to mark a thread‘s entry point with the STAThreadAttribute to let .NET know to initialize the UI thread on the STA. All of the VS.NET project templates put that attribute in to make sure you don‘t forget:
大致意思是:由于很多COM在.NET环境下如果使用多线程的话,会导致引用的COM不能正常运行,而如果不声明程序为STAThread的话,.NET就会自动使用多线程来提高效率,这样就会导致不可预知的后果。

以下引用另一同辈的发言:http://blog.csdn.net/qilang/archive/2006/06/06/775605.aspx
STA不是单线程的意思.英文为single threaded apartment.是一种套间(或译为公寓)线程模式.

sta thread并不表明应用程式的类型,和应用程序不搭界,恰相反,一个应用程序可以有多个线程.每个线程也可以有多个组件或对象.以前win16位系统的组件线程模式才真正是单线程.这是一种被淘汰了的模式.
线程模式用于处理组件在多线程的环境里并行与并互的方式.比如套间线程(STAThread)模式中接口跨线程传递必须被调度(Marshal),不调度直传肯定会失败!而MTA或FreeThread模式中的接口可以不经调度直接传递.
这种调度在特定的环境中非常影响性能(可有几百倍之差).如VB里只支持STAThread模式.FreeThread模式的组件会在里面表现成和跨进程一样慢!
线程模式是微软的COM基础中的极其重要的概念.一定要吃透!
我对.net真是一窍不通(没空去弄,对不起微软去年的奖赏).但我可以肯定,C#中的[STAThread]属性是应用程序的套间初始化代码.可以直接理解成SDK里的
CoInitialize(NULL); 
初始一个STA套间实际上是相当于开了一个消息窗口,所有调用经此窗口过程调度到组件内.
同理[MTAThread](不知有没有这个属性,自已去查)
可以理解成
CoInitializeEx(NULL,COINIT_MULTITHREADED )
这经常是一个对初入com大门的人来说,有一定难度但必须过的一道关.

时间: 2024-10-05 03:07:15

C#中的一些细节的相关文章

注意编码工作中的小细节

人们常说"细节决定成败". 编码工作中,同样需要关注细节. 本文将给出3个小实例来说明编码中关注细节的重要性,同时给出作者对如何注意编码细节的一点见解(说的不对,请指正). 例1 这个问题如此地显而易见,竟然没有被发现. List<int> numList = new List<int>(); numList.Add(3); numList.Add(1); numList.Add(4); numList.Add(2); numList.Add(5); numLi

java中变量运算细节 (2)

/* 目的:测试变量的运算方式 结果:byte a, b, c; a = b+c; 或者 a = b+10 形如这种形式的算式, 等式的右边的运算结果默认的都是int型的!因为等式右边有变量, 编译器无法确定变量的内容 ,因为它是变量!所以相加之后得到的int再默认强制转换成byte可能会损失精度. 而形如 a=4+5:这种常量的赋值,虽然 4 和 5 都默认的是int, 但都是常量,它们的值是确定的!所以如果 4+5的值超过了 byte的最大值的范围, 那就会编译出错!(也就是等式右边都是常量

OC中NSSet去重细节

我们都知道,NSSet在存储数据时,不允许存储相同数据?那么,这里的相同该如何理解呢? 很多人都简单的理解为按照其存储对象的内存地址进行评判.其实不然.经过个人实验证明:当类型为NSString,NSNumber..时,依然会比较其值是否相同,如果相同,依然会被去除. 其评判依据类似与isEqualTo 或者 isEqualToString方法:即先比较内存是否相等,然后比较其值是否相等. OC中NSSet去重细节,布布扣,bubuko.com

代码中的魔鬼细节

软件开发最关心的三个指标:性能.内存.程序稳定性三方面.本文总结一下最近项目扫尾工作中的一些遭遇: 使用正确的哈希函数 道路的路况绘制,道路的颜色由三个ID唯一确定,他们存储在一个哈希表中. 上图是两种哈希函数的性能对比.badHashFunction的结果为蓝色,goodHashFunction的结果为红色曲线. 使用坏的哈希函数,执行DJB_hash的结果冲突可能性十分大,因此哈希的平均查找次数非常大,在性能很好的机器上拖动时也有明显的卡顿现象. 优化哈希函数,将三个ID的所有位数拼接成一个

Java中的小细节

1.访问权限 1.private 只有本类才能被访问 2.default(默认)只有本包中才能被访问 3.protected只有子类和本包才能被访问,可以跨包. 4.public 可以在所有类中被访问 2.Java命名规范 1.类.所有单词首字母大写 2.方法.第一个单词的首字母小写 3.属性.第一个单词的首字母小写 4.包名.所有单词小写 5.常量.所有单词的字母大写.final定义的 Java中的小细节,码迷,mamicode.com

关于项目中遇到的细节化的原则

"时间都去哪儿了",每当我听到这首歌的时候,都会感慨,时间飞梭,恍如流逝,真的过的很快!一眨眼,来北京快1年了,目前从事着我喜欢的热爱的编程工作,虽然比不上JAVA,C等强类型语言,但PHP改变了我的生活,改变了我原先的运行轨迹!朝着目标一步一步前进! 新手,菜鸟目前来形容我再合适不过了,我承认我的确是一名名副其实的小白,作为一名菜鸟级的程序员,路还很遥远,但是学习到的东西不可谓不多,尤其是团队合作中遇到的问题因为一个人的错误会浪费很多时间和精力! 就在上个星期,我所在的单位因客户比较

JavaScript中的一些细节

1.设置id / class等属性 用 setAttribute 设置一些常规属性如 id ,className 的时候经常不起作用,只能用 object.id = value 这样来设置 news_item.id="news"+i; 2.DOM的一个实用功能是几乎所有Document对象实现的搜索方法同时也能被HTMLElement对象实现,唯一的例外是getElementById.只有document对象才能使用getElementById.若其它对象使用此方法则出错. var n

Java中String类型细节

Java中String类型细节 一 . String两种初始化方式 1 . String str1= "abc";//String类特有的创建字符对象的方式,更高效 在字符串缓冲区中检测"abc"是否存在 若存在则不重复创建,将地址赋值给str1. 若不存在,则在字符串缓冲区中创建对象并赋地址给str1. 2 . String str1= new String( "abc"); //构造函数初始化  或者  char [] ch={'a','b'

Java--关于计算表达式中赋值的细节问题

public class Test { public static void main(String[] args) { int t = 0; int p = 0; int q = 0; int tail = 1; int head = 2; /** * 这个(t != (t = tail))表达式进行判断的时候 * 第一个t还是未复制之前的值,第二个t是赋值之后的值 * 所以这里不是想象中的false,而是会出现true的 * 注意这个细节点 */ p = (t != (t = tail))

关于 MRC 开发中的一些细节

1. 谁申请,谁释放,适用于面向对象开发的一个原则,“配对原则” 2. 如果在实例化对象的时候,使用了 alloc,retain,copy,new(alloc&init),就需要有对应的 release 方法 - allocWithZone 不需要配对的 release 3. 工具-静态分析工具(analysis) 可以从代码结构上分析是否存在内存缺陷,本身不会运行代码,能够发现大部分的问题 4. 如果一个方法需要返回对象,这个要返回的对象就需要添加 autorelease,对象会在自动释放池销