您的位置:首页 > 编程语言 > C#

静态Static(C#)

2015-11-10 23:19 549 查看
静态可以修饰字段,属性,方法,构造函数,类。

1.静态字段(与之相对的是实例字段,也可以成为非静态字段)

C#中没有全局变量和全局函数的说法,如果找相之于等价的就可以认为是静态字段和静态方法了。

类中声明静态字段,那么类的所有实例都共享这个字段,这对于一些用于计数的字段再好不过,同时可以减少内存的

消耗。

因为静态字段被类的所有实例所共享,那么一般定位为Public。同时在声明是可以初始化,但是未初始化,它依然有

自己的默认值。

静态字段,从属于类,所以说需要直接用类来访问静态字段。

2.静态属性

说到底静态字段定义为Public,那么在任何地方都可以被调用,所以给字段做一定程度的封装才好,那么自然会有静

态属性这一说了。

3.静态方法

同静态字段一样,不可以被类的实例引用,必须由类直接调用。

静态方法中的实例字段是不可以直接访问的,必须先对类进行实例化,然后才能通过类的实例去访问实例字段和实例

方法。

当然,有人想我在静态类中的静态方法呢?哈哈,静态类是不允许你声明实例字段和方法的,所以不存在这样的问

题。详情见下面的静态类的说明。

4.静态构造器

感觉怪怪的,以前我都没听说过这。此构造器直接对类进行初始化,要说什么时候调用呢?只能说在首次访问类的时

候,还有就是静态构造器不能显式调用,那么这也就说明你给它设一百个参数都是没用的,不显式调用一切都是白搭

,所以说静态构造器不允许任何参数。

再者上面说的首次访问类的时候可能发生在各种情况下,所以使用应当注意。

作用:静态数据初始化

5.静态类

不能实例化,意味着类中声明上百上千个实例字段或者方法是没有用的(注意是实例)

静态类会被编译器自动标记为sealed和abstract,指定其不可扩展,所以不能被继承。

下面用代码来说明(比较粗糙):

XAML:

<Page
x:Class="Hodgepodge.BlankPage1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:Hodgepodge"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<TextBlock x:Name="txtblk1" FontSize="50" Text="Static" HorizontalAlignment="Center" />
<TextBlock x:Name="txtblk2" FontSize="30" />
<TextBlock x:Name="txtblk3" FontSize="30" />
<TextBlock x:Name="txtblk4" FontSize="30" />
<TextBlock x:Name="txtblk5" FontSize="30" />
<TextBlock x:Name="txtblk6" FontSize="30" />
</StackPanel>
</Grid>
</Page>


.CS:

using Windows.Foundation;
using Windows.UI;
using Windows.UI.Popups;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Shapes;

// “空白页”项模板在 http://go.microsoft.com/fwlink/?LinkId=234238 上提供

namespace Hodgepodge
{
/// <summary>
/// 可用于自身或导航至 Frame 内部的空白页。
/// </summary>
public sealed partial class BlankPage1 : Page
{
public BlankPage1()
{
this.InitializeComponent();

SurfaceBook surfaceBook = new SurfaceBook();
surfaceBook.Festival = "双十二";
txtblk2.Text = "原价:"+ SurfaceBook.Price.ToString();
txtblk3.Text = "节日还是没有变化(请注意其区别):" + surfaceBook.Festival;
txtblk4.Text = "现价:"+ SurfaceBook.CutPrice();
txtblk5.Text = "我原来的电脑是:" + Computer.Brand;
txtblk6.Text = "我现在的电脑是:" + Computer.UpGrade();
}

public static class Computer
{
//错误:不能再静态类中声明实例成员
//public string Brand { get; set; }

//正确:定义的是静态成员
private static string _Brand = "Dell";
//运用静态属性对静态字段进行封装
public static string Brand
{
get
{
return _Brand;
}
set
{
_Brand = value;
}
}

static Computer()
{
Brand = "Mac";
}

public static string UpGrade()
{
if(Brand.Equals("Mac"))
{
Brand = "Surface";
}
return Brand;
}
}

//错误:无法从静态类Computer派生出SurfaceBook
//public class SurfaceBook : Computer { }

public class SurfaceBook
{
private static int _Price;

public static int Price
{
get
{
return _Price;
}
set
{
_Price = value;
}
}

private string _Festival;
public string Festival
{
get
{
return _Festival = "双十一";
}
set
{
_Festival = value;
}
}

public SurfaceBook()
{
Price = 10000;
}

public static string CutPrice()
{
//错误:在静态方法中无法直接访问类的实例字段或实例方法,必须先实例化类
//if(Festival.Equals("双十一"))
SurfaceBook surfaceBook = new SurfaceBook();
if(surfaceBook.Festival.Equals("双十一"))
{
Price = 8000;
}
return "微软SurfaceBook大降价:"+surfaceBook.Festival+"只卖"+Price;
}
}
}
}


运行截图:



以上代码涉及到了Static的相关方面,但是还有其他很多方面也设计到了,对于代码的进一步说明可以在下一篇博客

中解释。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息