博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
记忆C#1.1基础(2)
阅读量:5834 次
发布时间:2019-06-18

本文共 5187 字,大约阅读时间需要 17 分钟。

   
相信会使用C#的是非常多的!今天来谈谈数据的类型和数据的实体化的问题;
     精髓:
          1:记住和数据类型相关的英文,
          2:int,char,结构体是值类型;
          3:类,接口,字符串,数组是引用类型;
          4:值类型是放在堆栈,引用类型是放在堆中;
          5:数据实体化时候最好使用hash-based collections来存放数据 ;
         
    一数据类型和操作符:
      
         
 
class
 Program
    {
        
static
 
void
 Main(
string
[] args)
        {
            
int
 myInt 
=
 
7
;
            System.Console.WriteLine(
"
Initialized, myInt: {0}
"
,
               myInt);
            myInt 
=
 
5
;
//
这种形式是和myInt=5没有区别的
            System.Console.WriteLine(
"
After assignment, myInt: {0}
"
,
               myInt);
        }
    }
二:
    const,static readonly 的区别
    用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序,值类型;
    用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化,所以其类型可以是值类型也可以是引用类型.
    注意的是,当static readonly类型变量是引用类型时,在当前类中此变量虽然不能再进行new 操作分配空间,但是可以更改此变量内的field的值 .
public
 
class
 usefulValues
    {
        
public
 
static
 
readonly
 
int
 testStart 
=
 
5
;
        
public
 
const
 
int
 testEnd 
=
 
10
;
    }
    
public
 
class
 myTest
    {
        
public
 
static
 
void
 Main(
string
[] args)
        {
            
for
 (
int
 i 
=
 usefulValues.testStart; i 
<
 usefulValues.testEnd; i
++
)
            {
                Console.WriteLine(
"
value is {0}
"
,i);
            }
            Console.ReadLine();
        }
    }
 
三 值类型和引用类
    
    简单说 值类型的变量包含自身的数据,而引用类型的变量是指向数据的内存块的,并不是直接存放数据 .
public
 
class
 ValueTypes
    {
        
private
 
string
 str1
=
"
6
"
;
        
public
 
string
 valueTypes()
        {
            
return
 str1;
            
        }
    }
    
public
 
class
 ReferenceTypes
    {
        
        
public
 
string
 referenceTypes()
        {
           ValueTypes vt1 
=
 
new
 ValueTypes();
           
            
return
 vt1.valueTypes().Clone() 
as
 
string
;
        }
    } 
    
public
 
class
 myTest
    {
        
public
  
static
 
void
 Main(
string
[] args)
        {
            ReferenceTypes rt 
=
 
new
 ReferenceTypes();
            ValueTypes vt 
=
 
new
 ValueTypes();
            Console.WriteLine(rt.referenceTypes());
            Console.WriteLine(vt.valueTypes());
            Console.ReadLine();
        }
    }
   使用值类型和引用类型的巧妙之处
     public class content   
    {
      private MyType _a = new MyType( );
      private MyType _b = new MyType( );
    }
    content var = new content();
    如上面的样的情况,你就可以考虑如果是使用值类型,那你只需要分配一段内存,分别存放_a,_b的值就可以..如果你使用引用类型那就要分配三部分内存段,所以设计时要考虑;
    在数组合中
    MyType [] var = new MyType[ 100 ];
    如果是值类型那就是1的内存段,但如果是引用类型就是101内存段.
    接口那通常都是引用类型;
    如需要节省内存空间就要使用值类型,而又由于我们常需要使用面向对象的方式来操作数据,这样又不得不使用引用类型,所以需要权衡!
 
四 通常的数据持久化(Immutable Atomic Value Types)
    这里.net有NHibernate.但在这里不谈这个,主要是讨论怎样写的 :
    
    
public
 
class
 Address
    {
        
private
 
string
 _part1;
        
private
 
string
 _part2;
        
private
 
string
 _city;
        
private
 
string
 _state;
        
private
 
int
 _zipCode;
        
public
 
string
 part1
        {
            
get
 { 
return
 _part1; }
            
set
 { _part1 
=
 value; }
        }
        
public
 
string
 part2
        {
            
get
 { 
return
 _part2; }
            
set
 { _part2 
=
 value; }
        }
        
public
 
string
 City
        {
            
get
 { 
return
 _city; }
            
set
 { _city 
=
 value; }
        }
        
public
 
string
 State
        {
            
get
 { 
return
 _state; }
            
set
            { 
//
ValidateState(value);
                _state 
=
 value;
            }
        }
        
public
 
int
 ZipCode
        {
            
get
 { 
return
 _zipCode; }
            
set
            { 
//
ValidateZip(value);
                _zipCode 
=
 value;
            }
        }
        
public
 
void
 ModifyAddress()
        {
            
//
 Modify:
            
this
.City 
=
 
"
Ann Arbor
"
;
            
this
.ZipCode 
=
 
48103
;
            
this
.State 
=
 
"
MI
"
;
        }
        
public
 
void
 NowAddress()
        {
            
this
.part1 
=
 
"
111 S. Main
"
;
            
this
.City 
=
 
"
Anytown
"
;
            
this
.State 
=
 
"
IL
"
;
            
this
.ZipCode 
=
 
61111
;
        }
        
    }
    
public
 
class
 readonlyAddress
    {
        
private
 
readonly
 
string
 _line1;
        
private
 
readonly
 
string
 _line2;
        
private
 
readonly
 
string
 _city;
        
private
 
readonly
 
string
 _state;
        
private
 
readonly
 
int
 _zipCode;
        
public
 readonlyAddress(
string
 line1,
          
string
 line2,
          
string
 city,
          
string
 state,
          
int
 zipCode)
        {
            _line1 
=
 line1;
            _line2 
=
 line2;
            _city 
=
 city;
            _state 
=
 state;
            _zipCode 
=
 zipCode;
            
//
ValidateState(state);
            
//
ValidateZip(zipCode);
        }
    }
    
    
public
 
class
 myTest
    {
        
public
 
static
 
void
 Main(
string
[] args)
        {
            Address a1 
=
 
new
 Address();
            a1.NowAddress();
            a1.ModifyAddress();
            Console.WriteLine(a1.part1);
            Console.WriteLine(a1.City);
            Console.WriteLine(a1.ZipCode);
            Console.WriteLine(a1.State);
            Console.ReadLine();
        }
    
//
使用只读数据的类使用的Main函数.
  
//
      public static void Main(string[] args)
  
//
      {
  
//
          readonlyAddress ra = new readonlyAddress("111 S. Main",
  
//
"", "Anytown", "IL", 61111);
  
//
          Console.WriteLine(ra);
  
//
          Console.ReadLine();
  
//
      }
        
//
=====================================
        
    }
    
在上面代码中有//ValidateZip(value); 这个是用来做数据验证用的,是为保证存放的数据是一有效数据.如下   
public
 
class
 ValidataMessage
{
 
  
private
 
int
 _ErrLevel;
  
private
 
string
 _msg;
  
public
 
string
 ValidataMessage
  {
    
get
    {
      
return
 (_msg 
!=
 
null
 ) 
?
        _msg : 
string
.Empty;
    }
    
set
    {
      _msg 
=
 value;
    }
  }
}
比如也可以更复杂一点:
public
 
class
 ListBoxTest
   {
      
private
 
string
[] strings;
      
private
 
int
 ctr 
=
 
0
;
      
      
public
 ListBoxTest( 
params
 
string
[] initialStrings )
      {
         
         strings 
=
 
new
 String[
256
];
       
         
foreach
 ( 
string
 s 
in
 initialStrings )
         {
            strings[ctr
++
=
 s;
         }
      }
  
      
public
 
void
 Add( 
string
 theString )
      {
         
if
 ( ctr 
>=
 strings.Length )
         {
            
         }
         
else
            strings[ctr
++
=
 theString;
      }
      
      
public
 
string
 
this
[
int
 index]
      {
         
get
         {
            
if
 ( index 
<
 
0
 
||
 index 
>=
 strings.Length )
            {
               
            }
            
return
 strings[index];
         }
         
set
         {
            
            
if
 ( index 
>=
 ctr )
            {
               
            }
            
else
               strings[index] 
=
 value;
         }
      }
      
      
public
 
int
 GetNumEntries(  )
      {
         
return
 ctr;
      }
   }
   
public
 
class
 Tester
   {
      
static
 
void
 Main(  )
      {
         
         ListBoxTest lbt 
=
            
new
 ListBoxTest( 
"
Hello
"
"
World
"
 );
        
         lbt.Add( 
"
Proust
"
 );
         lbt.Add( 
"
Faulkner
"
 );
         lbt.Add( 
"
Mann
"
 );
         lbt.Add( 
"
Hugo
"
 );
        
         
string
 subst 
=
 
"
Universe
"
;
         lbt[
1
=
 subst;
        
         
for
 ( 
int
 i 
=
 
0
; i 
<
 lbt.GetNumEntries(  ); i
++
 )
         {
            Console.WriteLine( 
"
lbt[{0}]: {1}
"
, i, lbt[i] );
         }
      }
   }
总结 先从数据类型开始,又由Const 和 static Readonly的区别引出值类型和引用类型, 并谈到值类型和引用类型在使用内存上的区别,而为什么引用类型占用内存比值类型的大,我 们却还要使用它?这其中的一个主要原因是我们同样想使用面向对象的方式来操作数据,如上 面的代码那做就能将数据实体化,我们也可以大胆的想,Object本来就是一个容器,所以被实体 化的数据可以任意类型,任意数据类型就会和数据的验证有关系,这样就来到在属性中纺织复杂 逻辑的情况出,所以我们常需要写一个专门的方法来验证被实体的数据有效性! -------------------------works guo
 
 

转载地址:http://btucx.baihongyu.com/

你可能感兴趣的文章
.NET 设计规范--.NET约定、惯用法与模式-2.框架设计基础
查看>>
win7 64位+Oracle 11g 64位下使用 PL/SQL Developer 的解决办法
查看>>
BZOJ1997:[HNOI2010]PLANAR——题解
查看>>
使用Unity3D引擎开发赛车游戏
查看>>
HTML5新手入门指南
查看>>
opennebula 开发记录
查看>>
sql 内联,左联,右联,全联
查看>>
C++关于字符串的处理
查看>>
6、Web Service-拦截器
查看>>
Flask 源码流程,上下文管理
查看>>
Breaking parallel loops in .NET C# using the Stop method z
查看>>
修改故障转移群集心跳时间
查看>>
[轉]redis;mongodb;memcache三者的性能比較
查看>>
微软职位内部推荐-Sr DEV
查看>>
让你的WPF程序在Win7下呈现Win8风格主题
查看>>
802.11 学习笔记
查看>>
Leetcode-Database-176-Second Highest Salary-Easy(转)
查看>>
构建Docker Compose服务堆栈
查看>>
最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
查看>>
Hadoop生态圈-Kafka常用命令总结
查看>>