C#中的一些细节

时间:2023-02-13 07:31:59

 

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和 stringstr2=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数组,然后输出。

C#中的一些细节
        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());
}
}
C#中的一些细节

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

C#中的一些细节
    public void Read(string path)
{
StreamReader sr = new StreamReader(path,Encoding.Default);
String line;
while ((line = sr.ReadLine()) != null)
{
Console.WriteLine(line.ToString());
}
}
C#中的一些细节

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

C#中的一些细节
        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();
}
C#中的一些细节

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

C#中的一些细节
        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();
}
C#中的一些细节

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

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

C#中的一些细节
 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 }
C#中的一些细节

 

 

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

 

C#中的一些细节
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 }
C#中的一些细节

 

 

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

C#中的一些细节
 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 */
C#中的一些细节

 

 
 

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

C#中的一些细节
 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 }
C#中的一些细节

 

C#中的一些细节

 

⑦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大门的人来说,有一定难度但必须过的一道关.