数学建模社区-数学中国
标题:
初探c#--12,13,14
[打印本页]
作者:
韩冰
时间:
2005-1-26 00:57
标题:
初探c#--12,13,14
1。12 枚举(Enums)
. s& \5 |" d4 b. y# x
枚举声明为一组属性相同的常量定义一个统一的类别名字。它常用于一些在编译时已知范围的常量。但这些常量
/ h, g1 k# {7 z: Q. C# K
的具体值要在执行时才能确定。比如,已知三原色是红蓝绿,它们同属于颜色。可以定义如下:*/
8 F$ z A4 M. [$ ?3 @4 W
6 w( `9 K9 h' A' U/ Y. y* t$ }0 m
enum Color {
/ T# |4 }& y& d/ w' x
Red,
; A5 ]1 W r- R4 A$ R
Blue,
" W0 ?8 G- E6 a# q; M; w3 A& H
Green
5 C) f" r5 F/ Z& x# R! d/ ?+ D7 P
}
) u/ ]3 y" j9 E7 ?6 H% m i0 a
/*
) ?, n2 u8 L2 y7 ^4 d( m `( X7 i8 ~& L
我们创建一个shape(形体)类,每一个形体都会有颜色。颜色是属于“shape”的属性。但具体的颜色就要
8 u* g/ m$ m* _$ {
在执行时才能决定:*/
0 ?7 P3 O, a% g O, T
class Shape
. L( A4 Z# y& b8 J5 i5 m
{
4 V5 M5 ^6 K; G( Z! e+ n( w
public void Fill(Color color) {
; X- ^" `$ Z% J+ h, N' O
switch(color) {
. f2 o9 ^) V6 \, b6 }8 H; l
case Color.Red:
" h! x5 y8 v x S- |5 o9 I6 R
...
! X: [; c4 l) ?+ ]; N
break;
' O6 l K% H& d
case Color.Blue:
1 @, @5 w% _" z, |0 R g3 W7 a# v `) N
...
; A0 f5 q/ T' s0 F8 }2 l
break;
8 u* ]8 I+ z, ]; m5 C
case Color.Green:
0 A( x1 D: ^! a0 J
...
( E- a1 S1 I4 X, C6 C3 D+ H
break;
) }. s e6 X6 @! I( G7 s, d/ n
default:
7 ^1 P) K3 n! `. J) p! n5 ^" M; V
break;
9 R3 `7 V6 P6 L' M/ K
}
- E7 n3 Z3 c0 j2 O" y$ z
}
6 n& s7 z+ t7 L @
}
* i" {( h3 v' K
/*
0 ^: V+ ?' V5 l/ y- C$ ~
这个File方法地说明了如何将一种给定的颜色赋予shape类。枚举比起普通整数常量的优胜之处在于:它使得代
6 P$ M7 l8 s; W0 Q1 m) }
码更容易阅读理解和更安全。枚举的常量可以由编译器决定。使用时编译器还可以检查它的有效性。枚举其实
# D6 E, R2 J$ D# f% ~1 C* n
不是c#特有的。嘿嘿,我就不详细介绍喽。趁机投篮!如果有人感兴趣——自己看书!(为了避免香蕉吃的太多
% c6 {9 j: h: n. i4 G6 H$ I+ Z
就介绍本书《c语言编程常见问题解答》清华1996。29.00人民币。虽然古老,俺在书店还能见到)
$ u6 n& {0 r. V3 o( |( w
. a" K6 m! g$ E' m: D3 H5 n
+ s6 A+ b: P& s9 X' U, Q' q
1。13 名字空间(Namespaces)
; Y+ }2 R% u& i
我们在前面已对namespace花了不少笔墨(俺都忘了该如何接上了!O.K.请大家看完再倒)。我们曾经说“i not
: I0 E& l# ^4 t: R' n6 X# W
like the hello world”。但是在程序中要经常说就会很累,如果要在别的代码中用就更繁了,这时可以用
$ k& G& y) ?; W' I
namespace搭救。我把第一个例子切开,代码如下:*/
$ d# C3 ]9 s/ I$ K3 x7 J
. r) [1 p( U% s5 w
namespace MyOpinion
% A' U. B9 [, ]- J. W; X' H
{
; |; s1 A5 }9 R6 i
public class Message
3 _% Y2 z' e: m7 _5 j
{
1 J1 f8 \: q) y& b! j, n$ o7 p
public string GetMessage() {
1 A, A& l9 N7 t! ?& A
return "i dont like Hello world";
& q( l; |! G) L" m- L: B$ B
}
: J: Z6 n% @/ d" g
}
2 T# Y6 L+ w5 X6 J
}
( |9 \# h; _! R! B% i4 V2 ?) P
! ]5 j: K& z: {) u7 b7 G
/*
3 a2 X) k4 W U
如果我想用namespace建立一个自己的库,就要对我的自定义函数和类进行分类,并填入相应的namespace中。
8 U6 C' J- \8 g7 Y
如:*/
3 b, |: c: ]) Q2 \ X z
namespace Mylib.Csharp.MyOpinion
5 x4 I2 p( G* S" g1 b3 v5 y6 a
{
9 Q' h- p/ d h. \
public class Message
; d' o& f3 u* F% m9 B
{
- H1 c0 x, Y3 D$ ~
public string GetMessage() {
( g# N8 i" U3 M2 m) t# M
return "i dont like Hello world";
G" i/ ^/ D* O' t: l; M
}
W9 U( T& ?- ]% W! M! f8 c: V' y# `1 ?
}
9 z m* |/ N% n' w W
}
& }* |' T. f! Q; @; p
/*
/ ]) G" |2 P1 y3 o
namespace是分等级的,“Mylib.Csharp.MyOpinion”其实是缩写,每个“.”后面的namespace都被它前面的包
( I2 Z$ `/ H) y& O' B) @
含。如果拆开:*/
( ^4 A1 f- r. ?7 E2 _
$ e; p8 G& H8 }4 J0 g* s' I5 f3 Y
namespace Mylib
6 W+ [ Q& Q! P+ f
{
. c1 Z# ?/ a/ f# K0 Z( K
namespace Csharp
1 ]2 W' E3 E. w: a. ?
{
0 x4 L2 C6 ~$ d; `. `' @6 D4 \
namespace MyOpinion
) K8 R# k9 H q
{....}
# K* g, k8 q% s) X
}
0 m& p/ [4 d9 _+ C5 z. G/ j: X" J: G- w
}
8 O+ [2 g( s ?3 S2 {
/*
d' @* ?3 z: E5 g
然后,我们就可以用自己的库了:*/
+ n' `, u& `& r- Z
" b# {* T: u( k# f* o! Y! i! n
using Mylib.Csharp.MyOpinion;
1 w6 A: u/ N$ Y
class test
' [! j1 o4 @- ~* V F+ K7 ?
{
% E" [5 E$ a1 @7 i
static void Main() {
' L M- s8 K8 C3 |2 {2 a, d, t
Message m = new Message();
+ [ v7 v3 w6 Q7 y# s( l
System.Console.WriteLine(m.GetMessage());
2 j/ `. q- h7 I h$ c
}
6 B# p& A! d/ w# q
}
5 U: k C; G6 f! n$ q, f1 t
/*
! Z! @* l/ a) W h3 L1 C5 v+ ^
不过无论我们命名如何小心都会出现重名,即命名冲突。这时可以用别名来解决,比如上面的代码可以这样:*/
5 E+ W$ o; N/ v0 M1 p2 Q
, h4 n9 f$ y. L, p: F3 [) f( O
using MessageSource = Mylib.Csharp.MyOpinion;
& ?" x1 }' V$ Z2 O+ y/ W: W3 l
class test
$ A: L3 i; C9 \
{
6 ^1 _( ~4 r' s2 {
static void Main() {
- S/ i, U* u2 U! G) X; ]
MessageSource m = new MessageSource();
/ c% e# h8 R2 O6 t
System.Console.WriteLine(m.GetMessage());
9 ~ w! \2 Y/ F8 b8 x4 H
}
3 b. n) j+ X+ \4 T
}
: m6 T- b+ S% v3 n
7 ?' k( g/ ?, s) u9 r& N6 r
1.14 属性(Properties)
2 M- f+ y2 ^* O* U6 x% _
关于属性就不用多说了。可能有点特别的是如何得到一个属性和设置一个属性。请诸位看下例:*/
; h2 r, O( w' W" H- ]7 M) C4 O
3 l) f0 s. c3 V7 c5 _* K
public class Button: Control
3 B* J, i( x L2 K* r0 Q+ I
{
' Q0 {$ D% E; z& l3 g5 I- |4 W, ] a
private string caption;
. X) K6 o! A8 m$ `
public string Caption {
4 ~ F) c# b/ S. u! [
get {
+ ]2 c$ J- w: n$ B( {
return caption;
! k$ V& E [0 i$ s8 ]
}
. P: g5 k0 T0 n k& d& R" A6 x) l# N
set {
% y9 P6 {% i$ [
caption = value;
" O; o) A' V3 d' \
Repaint();
6 N3 i1 x0 y4 c: m
}
( b& W4 r! o, B1 k4 D2 |8 z. O4 \
}
) A# N5 U; x( t) X4 ~# e* H
}
" `2 _1 {" J) V$ N* P
/*
1 S( ~- W. s* P6 j
" Z: B' P& S: z# M- s
有了上面的定义,我们就可以对Button进行读取和设置它的Caption属性:*/
# ^0 `* c/ k3 M0 O9 s
2 y3 `. E4 k- F$ S* J
Button b = new Button();
9 p A8 x; E* L" w8 Z l
b.Caption = "ABC"; // 设置
) P, i+ \. W4 R% V: F" {) w7 O
string s = b.Caption; // 读取
& ~3 @) l' E2 L, r# H% a. n
b.Caption += "DEF”; // 读取 & 设置
作者:
jyoituronn
时间:
2005-11-3 00:39
<
>不错不错,正在学</P>
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5