C#中??和?分别是什么意思?

  在C#中??和?分别是什么意思?


1. 可空类型修饰符(?):引用类型可以使用空引用表示一个不存在的值,而值类型通常不能表示为空。例如:string str=null; 是正确的,int i=null; 编译器就会报错。为了使值类型也可为空,就可以使用可空类型,即用可空类型修饰符"?"来表示,表现形式为"T?"例如:int? 表示可空的整形,DateTime? 表示可为空的时间。T? 其实是System.Nullable(泛型结构)的缩写形式,也就意味着当你用到T?时编译器编译 时会把T?编译成System.Nullable的形式。例如:int?,编译后便是System.Nullable的形式。

2. 三元(运算符)表达式(?:):例如:x?y:z 表示如果表达式x为true,则返回y;如果x为false,则返回z,是省略if{}else{}的简单形式。

3. 空合并运算符(??):用于定义可空类型和引用类型的默认值。如果此运算符的左操作数不为null,则此运算符将返回左操作数,否则返回右操作数。例如:a??b 当a为null时则返回b,a不为null时则返回a本身。空合并运算符为右结合运算符,即操作时从右向左进行组合的。如,“a??b??c”的形式按“a??(b??c)”计算。

在ASP.NET开发中一些单词的标准缩写

有些词可能共用一些缩写。带星号的缩写或词来源于PeopleSoft标准。

The following standard word abbreviations should be used in naming records, fields, and SQRs:

Word(s) Abbreviation Description
Abbreviate
Abbreviation
ABRV  
Academic ACAD  
Accept
Acceptance
Accepted
ACPT  
Access ACCS  
Accident ACDNT  
Accomplish
Accomplishment
Accomplishments
ACMP  
Account* ACCT*  
Accounting* ACCTG*  
Accounts Payable
Advanced Placement
AP  
Accounts Receivable AR  
Accredited ACRD  
Accrual ACRL  
Accumulated* ACCUM*  
Accumulation
Accumulative
ACUM  
Achieve
Achievement
ACHV  
Acquisition* ACQ*  
Act
Active
Activity
American College Test
ACT  
Action* ACTN*  
Actual ACTL  
Add
Added
ADD  
Additional* ADDL*  
Address* ADDR* Narrative data which describes a person, place or thing's location
Ad hoc ADHC  
Adjudicate
Adjudicated
Adjudication
ADJD  
Adjusted Gross Income AGI  
Adjustment* ADJ*  
Administered
Administrated
Administration
ADM  
Admissible
Admission
ADMS  
Admittance
Admitted
ADMT  
Advanced Placement
Accounts Payable
AP  
Advice ADVC  
Affiliation AFFL  
After AFT  
Age AGE  
Agency AGCY  
Agent AGNT  
Aid AID  
Alien ALN  
All ALL  
Allocate
Allocation*
ALLOC*  
Alpha ALPH  
Alter
Alternate
ALT  
Alumni
Alumnus
ALMN  
AM AM "Ante Meridiem" (morning)
American College Test
Act
Active
Activity
ACT  
Amount* AMT* Monetary value(s)
Analysis ANLS  
Annual* ANNL*  
Anonymous ANON  
Answer ANS  
Apartment APT  
Appeal
Appealed
APEL  
Applicant* APP*  
Application* APPL*  
Appointment APPT  
Approval
Approve
APRV  
Area AREA  
Array ARAY  
Arrears ARRS  
Ascending ASC  
Assign
Assigned
Assignment
ASGN  
Association ASSC  
Assumption ASMP  
Athlete
Athletic
ATHL  
Attach ATCH  
Attempt ATMPT  
Attend
Attendance
ATND  
Attention ATTN  
Attribute ATTR  
Audit
Audited
ADT  
Authority
Authorize
AUTH  
Auxiliary AUX  
Availability
Available
AVL  
Average AVG The mean of two or more numbers
Average Cumulative Grade ACG  
Award
Awarded
AWRD  
Balance* BAL* The net value (balance) of an account
Bank BNK  
Bargain BARG  
Base
Basic
BAS  
Batch BTCH  
Before BEF  
Begin
Beginning
BEGN  
Beginning of Term BOT  
Benefits BEN  
Bid BID  
Bill
Billing
BILL  
Billing and Receivables System BRS  
Birth BRTH  
Board BRD  
Break BRK  
Budget
Budgetable
BUD  
Budget Balance Account BBA  
Build
Building
BLD  
Business BUS  
Business Unit* BU*  
Buy
Buyer
BUY  
Calculate
Calculated
Calculation*
CALC*  
Calendar* CAL*  
Call CALL  
Campaign CMPN  
Campus CMPS  
Cancel
Canceled
CAN  
Capacity CAP  
Capitalization CPLZ  
Card CRD  
Career CAR  
Carrier CRIR  
Cartridge CART  
Case CSE  
Cash CSH  
Catalog CTLG  
Category* CATG*  
Census CENS  
Center CTR  
Certificate
Certification
CERT  
Change
Changed
CHG  
Chapter CHAP  
Charge CRG  
Chartfield CHARTF  
Check
Checked
CHK  
Citizen
Citizenship
CTZN  
City CTY  
Class CLAS  
Clear
Cleared
CLR  
CLEP CLEP  
Close CLO  
Club CLB  
COBRA* CBR*  
Code* CD* Data which represents encoded values (translate or code table)
Collect
Collection
CLCT  
College COLG  
Column CLMN  
Combination
Combine
COMB  
Command CMD  
Comment CMT An explanatory, illustrative or critical note, remark or observation
Committee CMMTTEE  
Company* CO*  
Comparative* COMPA*  
Competitor CPTR  
Complete
Completion
Compliance
CMPL  
Component CMPT When the meaning is "part", use abbreviation "PRT".
Composite
Compensation
COMP  
Conditional COND  
Confidential CNFD  
Confirm
Confirmation*
CONF*  
Constant CNST
CST
Data which is unchanging or invariable
Contact CTCT  
Continue
Continuing
Continuous
CONT  
Contract
Contractor
CNTR  
Control* CNTL*  
Conversation* CONVR*  
Conversion*
Convert*
Converted
CNV*  
Correspondence CRSP  
Cost COST  
Count
Counter
CNT A number of people or things that have been "counted", such as inventory cycle count
Country CTRY  
County CNTY  
Course* CRSE*  
Coverage* COVRG*  
Create CRE  
Credential CRDL  
Credit* CR*
CRDT
Use "CR" for field names relating to financial data
Use "CRDT" for field names relating to academic work
CREF CREF  
Cross CRS  
Cross List
Cross Listed
XLST  
Cross Reference XREF  
Cumulative CUM  
Currency* CURR*  
Current* CUR*  
Cursor CRSR  
Custodian CSTN  
Customer* CUST*  
Daily DLY  
Data DATA  
Data Processing DP  
Date* DT* A calendar day, month, and year (including century)
Date-Time Stamp DTTM  
Day* DD*
DY*
A day of the week (Sunday, Monday, etc.)
Dead
Death
Deceased
DEAD  
Debit* DR*  
Decimal DEC  
Deduct
Deduction*
DED*  
Default* DFLT*  
Deficit DFCT  
Definition* DEFN*  
Degree DEG  
Delete DEL  
Deliver
Delivery
DLVR  
Demo DMO  
Dental DNTL  
Department* DEPT*  
Department of Motor Vehicles DMV  
Dependency
Dependent*
Depends
DEP*  
Deposit DPST  
Depreciation* DEPR*  
Description* DESCR*
DSC
Narrative data which translates a code or number. When a suffix, use "_DSC" (see Standard Field Name Suffix table).
Design DSGN  
Destination* DEST*  
Detail* DETL*  
Develop
Development
Deviation
DEV  
Difference
Differential
DIFF  
Digit DGT  
Direct
Direction
Directional
DIR  
Disability
Disabled
DISA  
Disbursed
Disbursement
DSB  
Discount* DISC*  
Displacement DSPL  
Display DISP  
Disposition DSP  
Distribute
Distribution*
DIST*  
District DSTR  
Division DIV  
Division of Continuing Education DCE  
Document DOC  
Donor DONR  
Down DN  
Drive
Driver
DRV  
Drop DRP  
Due DUE  
Duplicate*
Duplication
DUP*  
Each EA  
Early ERLY  
Earn
Earned
Earnings*
EARN*  
Earned Income Credit EIC  
Educate
Education
EDU  
Effect
Effective*
EFF*  
Effective Date* EFFDT*  
Effective Date Sequence* EFFSEQ*  
Effort EFRT  
Elect
Elected
Elective
ELCT  
Electronic Data Interchange EDI  
Electronic Funds Transfer EFT  
Electronic Mail EM  
Eligibility*
Eligible
ELIG*  
Emergency EMRG  
Emphasis EMPH  
Employee* EE*
EMPL
 
Employee ID* EMPLID*  
Employer* ER*  
Employment EMPLMT  
Encumber
Encumbrance
ENCB  
End
Ending
END  
End of Term EOT  
Endorse
Endorsement
ENDR  
Endorsement ENDR  
Endow
Endowment
ENDW  
Engineer
Engineering
ENGN  
English ENGL  
Enrichment ENRCH  
Enrollment ENRL  
Enter
Entered
Entry
ENTR  
Entitle
Entitlement
ENTL  
Equal
Equality
Equivalence
Equivalent
EQ  
Equal Employment Opportunity
Equal Opportunity
EEO  
Equip EQP  
Error ERR  
Establishment ESTB  
Ethnic ETHN  
Evaluation
Evaluator
EVAL  
Event EVNT  
Exam EXM  
Exception EXCP  
Exclude
Exclusion
EXCL  
Execute
Execution
EXEC  
Exempt
Exemption
EXMT  
Expect
Expected
EXPC  
Expected Family Contribution EFC  
Expedite XPDT  
Expense
Export
Express
EXP  
Experimental EXPM  
Expiration
Expire
EXPR  
Export
Expense
EXP  
Extend
Extended
Extension
EXT  
External EXTR  
Facility FCLT  
Faculty FAC  
Family FMLY  
Family Eduaction Rights and Privacy Act FERPA  
Fast FST  
Father FATH  
Federal FED  
Federal Labor and Security Act FLSA  
Fee FEE  
Feet
Full Time
FT  
FICA FICA  
Field
Fields
FLD  
File FILE  
Final FNL  
Financial* FIN*  
Financial Aid FA  
Fine FINE  
First FRST  
Fiscal FISC  
Fiscal Year FY  
Fiscal Year to Date FYTD  
Fix
Fixed
FIX  
Flag FLG
SW
Data which functions as a flag or indicator. Used with only two possible states/conditions. Data should normally be "Y" or "N".
Flexible Spending Account FSA  
Floor FLR  
For FOR  
Foreign FGN  
Foreign Key FK  
Form FRM  
Format FMT  
Former FORMR  
Free FREE  
Free Application for Federal Student Aid FAFSA  
Free on Board FOB  
Freeze
Frozen
FRZ  
Frequency* FREQ*  
Fresh
Freshman
FRSH  
From FR  
Fulfill
Fulfilled
FULF  
Full Time FT  
Full Time Equivalent FTE  
Function
Functional
FCN  
Fund
Funding
FUND  
Future FUT  
Garnishment* GARN*  
General GENL  
General Education Degree GED  
General Ledger GL  
Geographic
Geography
GEOG  
Gift GFT  
Global GLBL  
Government GOVT  
Grade GDE
GRD
A value assigned to reflect performance or position on a scale
Grade Point Average GPA  
Graduate GRAD  
Grant
Granted
GRNT  
Gross GROS  
Group GRP  
Guarantee GUAR  
Guaranteed Student Loan GSL  
Guest GST  
Handicap
Handicapped
HAND  
Head HEAD  
Header* HDR*  
Health HLTH  
Held
Hold
HLD  
Help HLP  
Hierarchy HIER  
High H Normally used in conjunction with another word (i.e., High School abbreviated as "HS").
High School HS  
High School Services HSS  
Higher Education HED  
Highway HWAY  
Hire HIRE  
History HST  
Home HM  
Honor HONR  
Honor Society HSC  
Hospital HOSP  
Hour HH A duration of time expressed in hours
Hourly HRLY  
Hours* HRS*  
House
Housing
HSE  
How HOW  
Human Resources HR  
Human Resource System HRS  
Identification
Identifier*
Indicator
ID* Alphanumeric data which identifies a person, place, or thing
Image IMG  
Immune
Immunization
IMUN  
Impact IMPC  
Implementation IMPL  
Import IMP  
Import/Export IMPEXP  
Inch IN  
Include INCL  
Income INCM  
Increase
Increment
INCR  
Index INDX  
Indicator ID
IND
 
Individual INDV  
Individual Student Information Report ISIR  
Information INFO  
Initial
Initialize
INIT  
Injury* INJ*  
Inoculation INOC  
Input INPT  
Inquiry INQ  
Insert ISRT  
Institution INST  
Instruction
Instructional
Instructor
ISTR  
Instructional Need Analysis System INAS  
Insurance INS  
Inter-Unit* IU*  
Interest INT  
Interface* INTFC*  
Internal INTR  
International INTL  
Interval INVL  
Interview
Interviewer
INTV  
Invent INVN  
Inventory INV  
Investment* INVEST*  
Invitation
Invite
INVT  
Invoice INVC  
Issue
Issued
ISS  
Item ITM  
Job JOB  
Journal* JRNL*  
Junior JR  
Junior Science JS  
Key KEY  
Label LBL  
Labor LBR  
Laboratory LAB  
Language LNG  
Last
List
LST  
Late LATE  
Latitude LAT  
Layoff LAYF  
Leave LV  
Lecture LCTR  
Ledger* LED*  
Legal LGL  
Lender LNDR  
Length* LEN*  
Letter LTR  
Level LVL  
Liaison LISN  
Liberal Education LBD  
Library LIB  
License LIC  
License Plate Number LIC_PLTE_NBR  
Life LIFE  
Limit* LIM*  
Line*
Loan
LN*  
Link
Linked
LNK  
Liquid LIQ  
List
Last
LST  
Literal LTRL  
Load LOAD  
Loan
Line*
LN  
Locate
Location*
LOC*  
Lock LK  
Locker LKR  
Log LOG  
Log on LOGON  
Long
Longest
LONG  
Long Term Care LTC  
Long Term Disability LTD  
Longitude LON  
Lot LOT  
Low LOW  
Mail
Mailer
Mailing
MAIL  
Maintenance* MAINT*  
Major MJR  
Make MK  
Manager MGR  
Map MAP  
Marital MRTL  
Message Agent Server MAS  
Mask MSK  
Master Academic Records System MARS  
Match
Matching
MTCH  
Math MTH  
Matriculated
Matriculation
MTRC  
Maximum* MAX*  
Medical
Medicinal
MED  
Meet
Meeting
MT  
Member MBR  
Membership MSHP  
Memo
Memorandum
MMO  
Memorial MEMR  
Merchandise MERCHNDS  
Merchant MERCH  
Merit MERT  
Message
Messages*
MSG*  
Meter MTR  
Method METH  
Microfilm MFILM  
Middle MID  
Military MIL  
Minimum* MIN*  
Minor MINR  
Minute MNT
MM
A duration of time expressed in minutes
Miscellaneous MISC  
Mode MDE  
Modification
Modifier
MOD  
Monetary
Money
MONY  
Month* MM*
MN*
A calendar month in numeric form (e.g., 01=January)
Month-to-Date* MTD*  
More MORE  
Mother MOTH  
Move MOVE  
Multiple MULT  
Name NM
NME
Word(s) by which a person, place or thing is commonly known
National NATL  
National Association of College and University Business Officers NACUBO  
National Student Loan Direct System NSLDS Commonly known as the "Perkins Loan"
Navigation NAV  
New NEW  
Next NXT  
Next of Kin NOK  
No Charge NC  
No Credit NOCR  
No Print NPRT  
Nominal NOM  
Non NON  
Non-Personal Services NPS  
Not NOT  
Not Applicable NA  
Note
Notice
Notification
Notify
NOTE  
Number*
Numeric
NBR* Numeric data which identifies a person, place, or thing
Object
Objective
OBJ  
Occupation OCP  
Occurs OCC  
Offer
Offered
OFFR  
Office OFFC  
Officer OFCR  
Official OFCL  
Old OLD  
Online ONLN  
Open OPN  
Operator* OPR*  
Option
Optional
Options
OPT  
Order ORDR  
Organization
Organize
ORG  
Orientation ORNT  
Origin
Original
Origination
ORIG  
Other OTHR  
Out OUT  
Over OVR  
Overhead OH  
Override OVRD  
Overtime OT  
Own
Owned
OWN  
Owner OWNR  
Packaged PACK  
Paid PAID  
Paper PPR  
Parameter* PARM*  
Parent PAR  
Parity
Priority
PRTY  
Park PRK  
Part
Partial
PRT  
Part Time PT  
Participation PRTP  
Pass
Passed
PASS  
Past PAST  
Patron PTRN  
Pay
Payable
Payment
PAY  
Payroll PYRL  
Pedestrian PED  
Pell (Pell Grant) PEL  
Pending PEND  
Pension PENS  
Percent*
Percentage
Percentile
PCT* Part of a whole expressed in hundredths
Period* PD*  
Period-to-Date* PTD*  
Perkins Loan NSLDS Common name for National Student Loan Direct System
Permanent PERM  
Permit PRMT  
Person PERS  
Personal
Personnel
PSNL  
Personal Identification PIN  
Personnel Action Notification PAN  
Phone PHN  
Physics PHYS  
Place PLCE  
Plan PLN  
Plate PLTE  
Pledge PLDG  
PM PM "Post Meridiem" (afternoon)
Point PNT  
Policy PLCY  
Position* POSN*  
Post
Posted
POST  
Postal PSTL  
Potential POTN  
Predicted PRED  
Preference
Preferred
PREF  
Prefix PRFX  
Premium PREM  
Prerequisite PREQ  
Prescribed PSCR  
Presentation PRST  
President PRES  
Previous
Prior
PREV  
Price PRC  
Price Level PL  
Primary PRIM  
Primary Key PK  
Principal
Principle
PRIN  
Principal Investigator PI  
Print
Printed
PRN  
Prior
Previous
PREV  
Priority
Parity
PRTY  
Probation
Problem
PROB  
Procedure
Process
PROC  
Profession
Professional
PRFS  
Proficiency PRFC  
Profile* PROF*  
Program PROG  
Project
Projected
PROJ  
Promissory PRMS  
Promotion PROM  
Proposal PRPS  
Prospect PRSP  
Province PRVN  
Purchase PUR  
Purchase Order PO  
Purge PRG  
Purpose PURP  
Qualitative
Quality
QAL  
Quantitative
Quantity*
QTY* A number of things other than money
Quantity-to-Date
Quarter-to-Date*
QTD*  
Quarter QTR  
Question QSTN  
Race RACE  
Range RNG  
Rank RNK Relative standing or position
Rate* RT* Numeric value expressing amount per some unit of coverage
Read
Reading
READ  
Real
Reallocation
REAL  
Reason* RSN*  
Recall RCL  
Receipt RCPT  
Receive
Received*
RECV*  
Receiver RCVR  
Recharge RCHG  
Recognition
Recognize
RECG  
Recommend RCMD  
Reconciliation* RECON*  
Record* REC*  
Recreate
Recreation
RECR  
Recruit
Recruiting
RCRT  
Reduce
Reduced
Reduction*
RED*  
Refer
Reference*
Referral
Referred
REF*  
Refund RFND  
Regional RGNL  
Registrar REGR  
Registration REG  
Reject
Rejection
RJCT  
Relate
Relation
Relationship
RLAT  
Release RLSE  
Religion
Religious
RELG  
Remaining RMNG  
Reminder RMDR  
Renewal RNWL  
Repeat
Repeatable
Repeated
REPT  
Replace
Replaced
REPL  
Reply RPLY  
Report* RPT*  
Request*
Requested
Require
Required*
Requisition*
REQ*  
Requirements* RQMT*  
Research RES  
Reserve
Reserved
RSRV  
Reserve Officers Training Corps ROTC  
Residence
Residency
Resident
RSDT  
Resign RSGN  
Resource RSRC  
Response RESP  
Restart RST  
Restock RSTK  
Restrict
Restricted
Restrictions
RSTR  
Result RSLT  
Retire*
Retirement*
RET*  
Retroactive RETR  
Return RTN  
Revenue REV  
Review RVW  
Revision REVS  
Revoke REVK  
Roll RL  
Roll up RLUP  
Room RM  
Route ROUT  
Row ROW  
RSVP RSVP French abbreviation meaning "please reply"
Run RUN  
Run Control RUNCTL  
Salary* SAL*  
Sale SALE  
Salutation SLTN  
Same SM  
Save SAVE  
Scale SCAL  
Schedule*
Scheduled
Scheduling
SCHED*  
Scholar
Scholarship
SCHLR  
Scholastic
School
SCHL  
Scholastic Aptitude Test SAT  
Science SCI  
Score SCR A number that expresses merit or performance
Screen SCRN  
Search SRCH  
Second SCND
SS
Use "SCND" for field names relating to number two in a countable series
Use "SS" for field names relating to a duration of time expressed in seconds
Section SCTN  
Secure
Security*
SEC*  
Segment SEG  
Select*
Selection
Selective
SEL*  
Semester SEM  
Semi Finalist SEMF  
Senate
Senator
SEN  
Send SND  
Senior SR  
Sent SNT  
Separate SEPR  
Sequence* SEQ*  
Serial SERL  
Service SERV  
Session* SESSN*  
Sex SEX  
Sharing SHR  
Sheet SHET  
Shelter SHLT  
Shift SHFT  
Shipping SHIP  
Short SHRT  
Sign SGN  
Simulated SIM  
Site SITE  
Size SZ  
Skill SKL  
Skip SKP  
Social
Society
SOC  
Social Security Number SSN  
Soft SFT  
Solid SLID  
Sophomore SOPH  
Sort SRT  
Source SRC  
Special
Specialty
SPCL  
Specific
Specification
SPEC  
Sponsor
Sponsored
SPON  
Sports SPRT  
Spouse SPSE  
Square SQ  
Stack STCK  
Staff STF  
Stage STG  
Stamp STMP  
Standard STD  
Standard Deviation STDV  
Start
Starting
STRT  
State ST  
Statement STMT  
Static STC  
Statistics* STAT*  
Status STS  
Step STP  
Stipend STPD  
Stock STK  
Stop STOP  
Street STR  
String STRG  
Structure STRC  
Student STU  
Student Academic Records SAR  
Student Credit Hour SCH  
Study STDY  
Subcampaign SCMP  
Subject SUBJ  
Subordinate SUB  
Subsidiary SUBS  
Suffix SFX  
Summation
Summary*
SUM*  
Supervisor*
Support
SUP*  
Supplement
Supplemental*
SUPL*  
Survey SRVY  
Suspense SUSP
SUSPN
 
Switch FLG
SW
Data which functions as a flag or indicator. Used with only two possible states/conditions. Data should normally be "Y" or "N".
System SYS  
Table
Tables
TBL  
Taken TKN  
Tape TAPE  
Target TRGT  
Taught TGHT  
Tax
Taxable
TX  
Tax ID Number TIN  
Team TEAM  
Temperature TEMP  
Template* TMPL*  
Temporary TMP  
Tenure TENR  
Term TRM  
Terminal TRML  
Terminate TRMT  
Test TST  
Text TXT Narrative informational data such as a message or error text
Thermidor THERM 13th Month
TIAA TIAA  
Ticket TKT  
Time TM Hours and minutes. May include seconds, hundredths of seconds.
Time keeping TMKP  
Time-stamp TS A system generated Time-stamp
Title TITL  
Today TDY  
Total* TOT*  
Tour TOUR  
Town CTY  
Track
Tracking
TRK  
Traditional TRAD  
Training* TRN*  
Transact
Transaction*
TRANS*  
Transcript TSCP  
Transfer* XFER*  
Translate
Translation
XLT Meaning "Crosswalk Table"
Transmit
Transmittal
XMIT  
Travel TRVL  
Tuition* TUIT*  
Type TYP  
Undergraduate UGRD  
Unemployment UNEMPL  
Unit UNIT  
Unit of Measure* UOM*  
Universal UNVRSL  
University UNIV  
Unpaid UNPD  
Unsecure
Unsecured
UNSEC  
Up To MAX  
Update
Updated
UPDT  
Upper UPR  
US Department of Education USDE  
Use
Used
USE  
User USR  
Vacation* VACN*  
Valedictorian VLDC  
Valid
Validate
Validation
VLD  
Value VAL  
Variable VAR  
Vehicle* VEH*  
Vendor VEND  
Verbal VRBL  
Verify
Verified
VERF  
Veteran VET  
Vice President VP  
Violation VIO  
Visa VISA  
Visit VST  
Voucher VCHR  
W2 W2  
W4 W4  
W9 W9  
Waived WVED  
Week
Work
Worked
Worker(s)
WK  
Width WID  
With W Normally used as part of a compound word (i.e., Withdrawl abbreviated as "WDRL").
Withdrawal WDRL  
Withhold
Withholding
WHLD  
Women WMN  
Worksheet WKST  
Write
Written
WRT  
Year* YR*
YY*
A calendar year, including century (e.g., 1997)
Year-to-Date* YTD*  
Zip ZIP  
Zone ZN
 

C#SESSION丢失问题的解决办法

关于c# SESSION丢失问题解决办法

 

我们在用C#开发程序的时候经常会遇到Session很不稳定,老是数据丢失。下面就是Session数据丢失的解决办法希望对您有好处。

1、在WEB.CONFIG文件中修改SESSION状态保存模式,如:<sessionState mode='StateServer' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='180'/>

2、启动系统服务“ASP.NET状态服务 ”,系统默认是手动启动的

3、如果SESSION中保存的数据类型是自定义的,如结构,请在自定义数据类型处序列化会话状态,即在类或结构申明前加[Serializable]

完成以上3部,状态即可保存,但是在访问页面是浏览器显示的路径中增加了一段字符,如:(S(lto3j0eg25cztmqtxevm5tb4))

最近在做ASP.NET项目时,测试网站老是取不出Session中的值,在网上搜索了一下,找到一些解决方法,记录在这里。最后使用存储在StateServer中的办法解决了问题。

SessionState 的Timeout),其主要原因有三种。 
一:有些杀病毒软件会去扫描您的Web.Config文件,那时Session肯定掉,这是微软的说法。 
二:程序内部里有让Session掉失的代码,及服务器内存不足产生的。 
三:程序有框架页面和跨域情况。 
第一种解决办法是:使杀病毒软件屏蔽扫描Web.Config文件(程序运行时自己也不要去编辑它) 
第二种是检查代码有无Session.Abandon()之类的。 
第三种是在Window服务中将ASP.NET State Service 启动。

下面是帮助中的内容: 
(ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.2052/cpguide/html/cpconsessionstate.htm) 
ASP.NET 提供一个简单、易于使用的会话状态模型,您可以使用该模型跨多个 Web 请求存储任意数据和对象。它使用基于字典的、内存中的对象引用(这些对象引用存在于 IIS 进程中)缓存来完成该操作。使用进程内会话状态模式时请考虑下面的限制:

使用进程内会话状态模式时,如果 aspnet_wp.exe 或应用程序域重新启动,则会话状态数据将丢失。这些重新启动通常会在下面的情况中发生: 
在应用程序的 Web.config 文件的 <processModel> 元素中,设置一个导致新进程在条件被满足时启动的属性,例如 memoryLimit。 
修改 Global.asax 或 Web.config 文件。 
更改到 Web 应用程序的 \Bin 目录。 
用杀毒软件扫描并修改 Global.asax 文件、Web.config 文件或 Web 应用程序的 \Bin 目录下的文件。 
如果在应用程序的 Web.config 文件的 <processModel> 元素中启用了网络园模式,请不要使用进程内会话状态模式。否则将发生随机数据丢失。

还有这二种:

一:在第一个页面置了SESSION,然后REDIRECT去第二个页面。解决方法是在REDIRECT中设置endResponse为FALSE。

二: ASP.NET中使用了ACCESS数据库,而且数据库是放在bin目录中的。解决方法是不要放会更新的文件在BIN目录中。

参考:http://www.dotnet247.com/247reference/msgs/58/290316.aspx

Asp.net 默认配置下,Session莫名丢失的原因及解决办法

正常操作情况下Session会无故丢失。因为程序是在不停的被操作,排除Session超时的可能。另外,Session超时时间被设定成60分钟,不会这么快就超时的。

这次到CSDN上搜了一下帖子,发现好多人在讨论这个问题,然后我又google了一下,发现微软网站上也有类似的内容。

现在我就把原因和解决办法写出来。

原因:

由于Asp.net程序是默认配置,所以Web.Config文件中关于Session的设定如下: 
<sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

我们会发现sessionState标签中有个属性mode,它可以有3种取值:InProc、StateServer?SQLServer(大小写敏感) 。默认情况下是InProc,也就是将Session保存在进程内(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),这个进程不稳定,在某些事件发生时,进程会重起,所以造成了存储在该进程内的Session丢失。

哪些情况下该进程会重起呢?微软的一篇文章告诉了我们: 
1、配置文件中processModel标签的memoryLimit属性 
2、Global.asax或者Web.config文件被更改 
3、Bin文件夹中的Web程序(DLL)被修改 
4、杀毒软件扫描了一些.config文件。 
更多的信息请参考PRB: Session variables are lost intermittently in ASP.NET applications

解决办法:

前面说到的sessionState标签中mode属性可以有三个取值,除了InProc之外,还可以为StateServer、SQLServer。这两种存Session的方法都是进程外的,所以当aspnet_wp.exe重起的时候,不会影响到Session。

现在请将mode设定为StateServer。StateServer是本机的一个服务,可以在系统服务里看到服务名为ASP.NET State Service的服务,默认情况是不启动的。当我们设定mode为StateServer之后,请手工将该服务启动。

这样,我们就能利用本机的StateService来存储Session了,除非电脑重启或者StateService崩掉,否则Session是不会丢的(因Session超时被丢弃是正常的)。

除此之外,我们还可以将Session通过其他电脑的StateService来保存。具体的修改是这样的。同样还在sessionState标签中,有个stateConnectionString='tcpip=127.0.0.1:42424'属性,其中有个ip地址,默认为本机(127.0.0.1),你可以将其改成你所知的运行了StateService服务的电脑IP,这样就可以实现位于不同电脑上的Asp.net程序互通Session了。

如果你有更高的要求,需要在服务期重启时Session也不丢失,可以考虑将mode设定成SQLServer,同样需要修改sqlConnectionString属性。关于使用SQLServer保存Session的操作,请访问这里。

在使用StateServer或者SQLServer存储Session时,所有需要保存到Session的对象除了基本数据类型(默认的数据类型,如int、string等)外,都必须序列化。只需将[Serializable]标签放到要序列化的类前就可以了。 
如: 
[Serializable] 
public class MyClass

...... 
}

 

在C#中INTERFACE与ABSTRACT CLASS的区别

 1)在继承抽象类时,必须覆盖该类中的每一个抽象方法,而每个已实现的方法必须和抽象类中指定的方法一样,接收相同数目和类型的参数,具有同样的返回值,这一点与接口相同。  2)当父类已有实际功能的方法时,该方法在子类中可以不必实现,直接引用的方法,子类也可以重写该父类的方法(继承的概念)。  3)而实现 (implement)一个接口(interface)的时候,是一定要实现接口中所定义的所有方法,而不可遗漏任何一个。  4)另外,抽象类不能产生对象的,但可以由它的实现类来声明对象。

A. 两者都是抽象类,都不能实例化。B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。2. 不同A. interface需要实现,要用implements,而abstract class需要继承,要用extends。B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。C. interface强调特定功能的实现,而abstract class强调所属关系。D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。这个选择有两点含义:一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。E. abstract class是interface与Class的中介。interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。3. interface的应用场合A. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。B. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。C. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。D. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。4. abstract class的应用场合一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:A. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。B. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能。

 概念引入

●什么是接口?

接口是包含一组虚方法的抽象类型,其中每一种方法都有其名称、参数和返回值。接口方法不能包含任何实现,CLR允许接口可以包含事件、属性、索引 器、静态方法、静态字段、静态构造函数以及常数。但是注意:C#中不能包含任何静态成员。一个类可以实现多个接口,当一个类继承某个接口时,它不仅要实现 该接口定义的所有方法,还要实现该接口从其他接口中继承的所有方法。

定义方法为:

以下为引用的内容:
public interface System.IComparable
{
    int CompareTo(object o);

public class TestCls: IComparable
{
    public TestCls()
    {
    }

private int _value;
    public int Value
    {
        get { return _value; }
        set { _value = value; }
    }

public int CompareTo(object o)
    {

//使用as模式进行转型判断
        TestCls aCls = o as TestCls;
        if (aCls != null)
        {

//实现抽象方法
        return _value.CompareTo(aCls._value);
        }
    }
}

●什么是抽象类?

抽象类提供多个派生类共享基类的公共定义,它既可以提供抽象方法,也可以提供非抽象方法。抽象类不能实例化,必须通过继承由派生类实现其抽象方法, 因此对抽象类不能使用new关键字,也不能被密封。如果派生类没有实现所有的抽象方法,则该派生类也必须声明为抽象类。另外,实现抽象方法由 overriding方法来实现。

定义方法为:

以下为引用的内容:
/// <summary>
/// 定义抽象类
/// </summary>
abstract public class Animal
{
    //定义静态字段
    static protected int _id; 
    //定义属性
    public abstract static int Id
    {
        get;
        set;
    }

//定义方法
    public abstract void Eat();

//定义索引器
    public string this[int i]
    {
        get;
        set;
    } 
}

/// <summary>
/// 实现抽象类
/// </summary>
public class Dog: Animal
{
    public static override int Id
    {
        get {return _id;}
        set {_id = value;}
    }

public override void Eat()
    {
        Console.Write("Dog Eats.")
    }
}

3. 相同点和不同点

3.1 相同点

●都不能被直接实例化,都可以通过继承实现其抽象方法。 
●都是面向抽象编程的技术基础,实现了诸多的设计模式。

3.2 不同点

●接口支持多继承;抽象类不能实现多继承。 
●接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。 
●接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。 
●接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 
●接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。  
●接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或 许能给大家一些启示,除了我的一些积累之外,很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,当然我将 以一家之言博大家之笑,看官请继续。

3.3 规则与场合

1.请记住,面向对象思想的一个最重要的原则就是:面向接口编程。 
2.借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。 
3.抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 
4.接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系; 
5.接口多定义对象的行为;抽象类多定义对象的属性;  
6.接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。 
7.“接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。 
8.尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。 
9.接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。 
10.在接口中,所有的方法都默认为public。  
11. 如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物 (Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。

12.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 
13.对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。 
14.在抽象方法声明中不能使用 static 或 virtual 修饰符。

以上的规则,我就厚颜无耻的暂定为T14条吧,写的这么累,就当一时的奖赏吧。大家也可以互通有无,我将及时修订。

4. 经典示例

4.1 绝对经典

.NET Framework是学习的最好资源,有意识的研究FCL是每个.NET程序员的必修课,关于接口和抽象类在FCL中的使用,我有以下的建议:

1.FCL对集合类使用了基于接口的设计,所以请关注System.Collections中关于接口的设计实现; 
2.FCL对数据流相关类使用了基于抽象类的设计,所以请关注System.IO.Stream类的抽象类设计机制。

4.2 别样小菜

下面的实例,因为是我的理解,因此给经典打上“相对”的记号,至于什么时候晋升为“绝对”,就看我在.NET追求的路上,是否能够一如既往的如此执 着,因此我将把相对重构到绝对为止(呵呵)。 本示例没有阐述抽象类和接口在设计模式中的应用,因为那将是另一篇有讨论价值的文本,本文着眼与概念和原则的把握,但是真正的应用来自于具体的需求规范。

设计结构如图所示:

1. 定义抽象类

以下为引用的内容:
public abstract class Animal
{
    protected string _name; 
    //声明抽象属性
    public abstract string Name
    {
        get;
    }

//声明抽象方法
    public abstract void Show();

//实现一般方法
    public void MakeVoice()
    {
        Console.WriteLine("All animals can make voice!");
    }
}

2. 定义接口

以下为引用的内容:
public interface IAction
{
    //定义公共方法标签
    void Move();
}

3. 实现抽象类和接口

以下为引用的内容:
public class Duck : Animal, IAction
{
    public Duck(string name)
    {
        _name = name;
    } 
    //重载抽象方法
    public override void Show()
    {
        Console.WriteLine(_name + " is showing for you.");
    }

//重载抽象属性
    public override string Name
    {
        get { return _name;}
    }

//实现接口方法
    public void Move()
    {
        Console.WriteLine("Duck also can swim.");
    }

}

public class Dog : Animal, IAction
{
    public Dog(string name)
    {
        _name = name;
    }

public override void Show()
    {
        Console.WriteLine(_name + " is showing for you.");
    }

public override string Name
    {
        get { return _name; }
    }

public void Move()
    {
        Console.WriteLine(_name + " also can run.");
    }

}

4. 客户端实现

以下为引用的内容:

public class TestAnmial
{
    public static void Main(string [] args)
    {
        Animal duck = new Duck("Duck");
        duck.MakeVoice();
        duck.Show();

Animal dog = new Dog("Dog");
        dog.MakeVoice();
        dog.Show();

IAction dogAction = new Dog("A big dog");
        dogAction.Move();
    }
}

5. 他山之石

正所谓真理是大家看出来的,所以将园子里有创新性的观点潜列于此,一是感谢大家的共享,二是完善一家之言的不足,希望能够将领域形成知识,受用于我,受用于众。

●[url=]dunai[/url]认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。 
●桦山涧的收藏也很不错。 
●Artech认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。 
●shenfx认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。

最后,MSDN的建议是:

●如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。 
●如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 
●如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。 
●如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。

6. 结论

接口和抽象类,是论坛上、课堂间讨论最多的话题之一,之所以将这个老话题拿出来再议,是因为从我的体会来说,深刻的理解这两个面向对象的基本内容, 对于盘活面向对象的抽象化编程思想至关重要。本文基本概况了接口和抽象类的概念、异同和使用规则,从学习的观点来看,我认为这些总结已经足以表达其核心。 但是,对于面向对象和软件设计的深入理解,还是建立在不断实践的基础上,Scott说自己每天坚持一个小时用来写Demo,那么我们是不是更应该勤于键盘 呢。对于接口和抽象类,请多用而知其然,多想而知其奥吧。


SQL命令语句小技巧

1.[ ]的使用

  当我们所要查的表是系统关键字或者表名中含有空格时,需要用[]括起来,例如新建了两个表,分别为user,user info,那么select * from user和select * from user info就要报错,需要写成:select * from [user] 和 select * from [user info],不过千万不要因为有[]的帮助,就随意起名了,那是自找麻烦,不过我确实看到有人把用户表起名为user的。

2.NULLIF函数

  NULLIF(Expression1,Expression2):给定两个参数Expression1和Expression2,如果两个参数相等,则返回NULL;否则就返回第一个参数。

  等价于:Case WHEN Expression1=Expression2 Then NULL ELSE Expression1。

  例如Select NULLIF(1,1)返回NULL,Select NULLIF(1,2)返回1。

  有一个实际的应用,例如防止除0操作的放生,可以使用a/NULLIF(b,0),这样就不怕b是0了,当然除0操作也可以通过别的方式判断。

3.NULL

  NULL是个神奇的东西,表示空值,未知值,任何数与它加减乘除都返回NULL。

4.ISNULL函数

  ISNULL(Expression1,Expression2):给定两个参数Expression1和Expression2,如果Expression1是NULL,那么返回Expression2,否则返回Expression1。

  等价于:Case WHEN Expression1 is NULL Then Expression2 ELSE Expression1。

  例如Select ISNULL(NULL,1)返回1,Select ISNULL(1,2)返回1。

  有一个实际的应用,可以对空值进行默认值替代,例如SELECT ISNULL(email,'没有填写email') from table1,所有email为null的,用'没有填写email'来替代。

 5.COALESCE函数

  COALESCE(Expression1,Expression2,Expression3,......):接受一系列的表达式或列,返回第一个非空的值。

例如SELECT COALESCE(NULL,NULL,4,NULL,NULL,5),那么返回4,如果里面的参数都为NULL,那么会报错。

6.WITH TIES

  与top()和order by 一起用,可以返回多于top的行。防止丢失想要的信息。

如果按照order by 参数排序TOP n(PERCENT)返回了前面n(pencent)个记录,

但是n+1…n+k条记录和排序后的第n条记录的参数值(order by 后面的参数)相同,

则n+1、…、n+k也返回。n+1、…、n+k就是额外的返回值

  例如:有个表table1

(1)select * from table1 order by name desc :结果如下:

(2)select top(3) * from table1 order by name desc:结果如下:(只有三条)

(3)select top(3) with ties * from table1 order by name desc:结果如下:

7.ORDER BY NEWID():返回随机排序结果。

8.BETWEEN a AND b:返回大于等于a,小于等于b的结果。如果a>b,那么返回NULL。

9.不要在where条件中使用函数,会强制每一行都计算该函数,无法使用索引查找。

  例如:select * from table1 where id+3>5和select * from table1 where id>5-3,后者效率比前者高。

10.许多以_desc结尾的列,是为了更友好的表示一个列的含义。

  例如:SELECT * FROM sys.databases

11.推荐一个小插件,SQL Prompt,配合Microsoft SQL Server Management Studio,使用起来非常方便,同时再加上以下几个快捷键:

  (1)ctrl+5或F5,运行代码,如果想运行特定的语句,那么只是选中该语句,然后F5或ctrl+E即可。

  (2)ctrl+L:显示执行计划。

  (3)ctrl+R:显示隐藏下面的结果窗口,增大自己书写sql的空间。

  (4)ctrl+K,然后按Y,格式化SQL代码。

JQUERY判断CHECKBOX是否选中三种方法

方法一:
if ($("#checkbox-id")get(0).checked) {
    // do something
}

方法二:
if($('#checkbox-id').is(':checked')) {
    // do something
}

方法三:
if ($('#checkbox-id').attr('checked')) {
    // do something
}

JS中!=、==、!==、===的用法和区别

1、对于string,number等基础类型,==和===是有区别的

1)不同类型间比较,==之比较“转化成同一类型后的值”看“值”是否相等,===如果类型不同,其结果就是不等
2)同类型比较,直接进行“值”比较,两者结果一样
 
2、对于Array,Object等高级类型,==和===是没有区别的
进行“指针地址”比较
 
3、基础类型与高级类型,==和===是有区别的
1)对于==,将高级转化为基础类型,进行“值”比较
2)因为类型不同,===结果为false
 
var num = 1;

var str = '1';

var test = 1;

test == num   //true 相同类型 相同值

test === num  //true 相同类型 相同值

test !== num  //false test与num类型相同,其值也相同, 非运算肯定是false

num == str   //true  把str转换为数字,检查其是否相等。

num != str   //false  == 的 非运算

num === str  //false  类型不同,直接返回false

num !== str  //true   num 与 str类型不同 意味着其两者不等 非运算自然是true啦

== 和 != 比较若类型不同,先偿试转换类型,再作值比较,最后返回值比较结果 。

而 
=== 和 !== 只有在相同类型下,才会比较其值。
 
 
 

在对象比较中,对象相等和对象一致分别指的是什么?

对象数据存内存堆里,对象一致即内存堆相同,对象相等为哈希表中键同值可能不同

简单的讲:相等性(quality)就是两个对象,它们的值相等。同一性(identity)就是指引用的是否为同一个对象。 下面是我的读书笔记: C# 中有两种不同的相等:引用相等和值相等。值相等是大家普遍理解的意义上的相等:它意味着两个对象包含相同的值。例如,两个值为 2 的整数具有值相等性。

引用相等意味着要比较的不是两个对象,而是两个对象引用,这两个对象引用所引用的是同一个对象。我们这里把值相等叫做对象的“相等性(equality)”,把引用相等叫做对象的同一性(identity)。

我们都知道在System.Object类型中提供了一个名为Equals的虚方法,它的作用是在两个对象相等的情况下返回true,不相等时返回false。等等,这里的说的“相等”是哪个?是“相等性(equality)”还是“同一性(identity)”。

好吧,来看一下代码吧,System的Object方法是像下面这样实现的:

public class Object { public virtual Boolean Equals(Object obj)

{

// 如果两个引用指向的是同一个对象,那么它们肯定相等

if (this == obj) return true;

// 假定对象不相等

return false;

}

}

表明上看它好像是实现的很合理:

假如this和Obj引用同一对象,自然就是true了,因为Equals知道一个对象肯定等于它自身。

然而,如果this和Obj引用不同的对象哪?,Equals就不能肯定对象是否包含相同的值,

所以总结一句话就是:Object的Equals方法实现的只是“同一性(identity)”,而不是“相等性(equality)”。

多么的令人遗憾啊~!Object的Equals的默认实现并不合理,既然不合理我们就来重写它吧,先来看看如何在内部正确实现一个Equals方法(我把它概括为四个字——空、型、值、基):

如果obj参数为null,就返回false;

如果this和obj参数引用不同的类型对象,返回false;

针对类型定义的每个实例字段,将this对象的值和obj对象的值进行对比,任何字段不相等,就返回false;

调用基类的Equals方法,以便比较它定义的任何字段。如果基类的Equals方法返回false,就返回false;否则返回true;

再来看一下Object的Equals方法的实现代码:

public class Object

{

public virtual Boolean Equals(Object obj)

{

if (obj == null)

return false;

if (this.GetType() != obj.GetType())

return false;

// 如果对象属于相同的类型,那么在它们的多有字段都匹配的前提下返回true

// 由于System.Object没有定义任何字段,所以字段是匹配的

return true;

}

}

其实,这里要说一下,Microsoft并没有这样去实现他的代码,而是要比这个复杂的多的多。

那么Equals方法可以在子类中重写,那么就不可以用Equals方法来测试同一性(identity)了。怎么办啊?

Microsoft在Object中提供了一个静态方法ReferenceEquals,其原型如下:

public class Object

{

  public static Boolean ReferenceEquals(Object objA, object objB)

  {

  return (objA == objB);

  }

}

注意了啊,如果想要检查同一性(identity),那么务必调用ReferenceEquals,而不应该使用C#的==操作符(除非事先把它们转化为Object类型),

原因是其中某个操作数的类型可能重载了==操作符,为其赋予了其它语义。

另外,System.ValueType重写了Object的Equals方法。并进行了正确的实现来执行相等性(equality)检查,而不是同一性(identity)检查。

在内部,ValueType的Equals方法是像这样实现的:

  如果obj参数为null,返回false; 如果this和obj引用的不同类型的对象,返回false;

  针对类型定义的每个实例字段,都将this对象的值和obj对象中的值进行比较。

  如果有字段不相等,就返回false; 返回true;

  ValueType的Equals的方法不会调用Object的Equals方法。

  顺便说一下,ValueType的Equals方法是通过反射技术来完成的。由于CLR反射机制较慢,所以在定义自己的值类型时,应该重写Equals方法,并提供自己的实现,以便提高性能。当然在自己的实现中不要调用base.Equals。

   要重写Equals,必须遵循一下几点特性: x.Equals(x) 返回 true。 (自反性) x.Equals(y) 与 y.Equals(x) 返回相同的值。 (对称性) 如果 (x.Equals(y) && y.Equals(z)) 返回 true,则 x.Equals(z) 返回 true。 (传递性) 只要不修改 x 和 y 所引用的对象,x.Equals(y) 的后续调用就返回相同的值。 (一致性) x.Equals(null) 返回 false。

  对象们都住在不同的房间里,每个房间只能住一个对象.对象们都被锁在房间里,永远没有办法搬家(至少从我们讨论的角度来说,这个说法是正确的).所以如果你知道了一个对象的

房间号,就能找到对应的对象. 现在假如我们有两张名片,上面如果写着相同的房间号,我们就可以断定,这两张名片是同一个对象分发出来的,这就是同一性,也就是你所说的一致. 假如1

号房里住着一个值为1的整数对象, 2号房里住着另一个值为2的整数对象,3号房里住着另另一个值为1的整数对象.我们又有它们各自的一张名片, 那么,第一个名片和第三个对应的对

象的值是相等的,但是它们不是同一个对象,用你的词来说,也就是说它们"相等",但不"一致". 如果上面说得太清楚了,那么这里让你再困扰一会吧,哈哈: 这里的名片就是引用(i, count

之类的变量/字段等的名称); 房间所在的大楼就是内存,房间号就是内存地址. 对象就是内存里保存的数据.

  对象们都住在不同的房间里,每个房间只能住一个对象.对象们都被锁在房间里,永远没有办法搬家(至少从我们讨论的角度来说,这个说法是正确的).所以如果你知道了一个对象的房间号,就能找到对应的对象.

现在假如我们有两张名片,上面如果写着相同的房间号,我们就可以断定,这两张名片是同一个对象分发出来的,这就是同一性,也就是你所说的一致.

假如1号房里住着一个值为1的整数对象, 2号房里住着另一个值为2的整数对象,3号房里住着另另一个值为1的整数对象.我们又有它们各自的一张名片, 那么,第一个名片和第三个对应的对象的值是相等的,但是它们不是同一个对象,用你的词来说,也就是说它们相等,但不一致.

如果上面说得太清楚了,那么这里让你再困扰一会吧,哈哈:

这里的名片就是引用(i, count之类的变量/字段等的名称);

房间所在的大楼就是内存,房间号就是内存地址.对象就是内存里保存的数据.

C#中??和?分别是什么意思? 在ASP.NET开发中一些单词的标准缩写 C#SESSION丢失问题的解决办法 在C#中INTERFACE与ABSTRACT CLASS的区别 SQL命令语句小技巧 JQUERY判断CHECKBOX是否选中三种方法 JS中!=、==、!==、===的用法和区别 在对象比较中,对象相等和对象一致分别指的是什么?的更多相关文章

  1. Jquery判断Checkbox是否选中三种方法

    方法一:if ($("#checkbox-id")get(0).checked) {    // do something} 方法二:if($('#checkbox-id').is ...

  2. SQL命令语句小技巧

    1.[ ]的使用 当我们所要查的表是系统关键字或者表名中含有空格时,需要用[]括起来,例如新建了两个表,分别为user,user info,那么select * from user和select * ...

  3. JQuery 判断checkbox是否选中,checkbox全选,获取checkbox选中值

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. jquery取消事件冒泡的三种方法展示

    jquery取消事件冒泡的三种方法展示 html代码 <!doctype html> <html> <head> <meta charset="ut ...

  5. jquery判断checkbox是否选中及改变checkbox状态

    转自:http://blog.csdn.net/limingchuan123456789/article/details/11499665 jquery判断checked的三种方法:.attr('ch ...

  6. jquery判断checkbox是否选中及改变checkbox状态(转)

    jquery判断checked的三种方法:.attr('checked):   //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false.prop('c ...

  7. jquery判断checkbox是否选中及改变checkbox状态[转]

    jquery判断checked的三种方法: .attr('checked): //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或false .prop('c ...

  8. 判断图连通的三种方法——dfs,bfs,并查集

    Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...

  9. VS开发中的代码编写小技巧——避免重复代码编写的几种方法

    上一篇文章中程序员的幸福生活--有你的日子,每天都是情人节,收到了大家的很多好评.鼓励和祝福,非常感动,真诚的谢谢大家.也希望每个朋友都能保持一个积极向上的心态,去迎接丰富多彩的人生. 在开发过程中, ...

随机推荐

  1. hadoop FileSystem类和SequenceFile类实例

    Hadoop的FileSystem类是与Hadoop的某一文件系统进行交互的API,虽然我们主要聚焦于HDFS实例,但还是应该集成FileSystem抽象类,并编写代码,使其在不同的文件系统中可移植, ...

  2. ACM程序设计选修课——1057: Beautiful Garden(模拟+耐心调试)

    1057: Beautiful Garden Time Limit: 5 Sec  Memory Limit: 128 MB Submit: 25  Solved: 12 [Submit][Statu ...

  3. BZOJ 4820 [Sdoi2017]硬币游戏 ——期望DP 高斯消元

    做法太神了,理解不了. 自己想到的是建出AC自动机然后建出矩阵然后求逆计算,感觉可以过$40%$ 用一个状态$N$表示任意一个位置没有匹配成功的概率和. 每种匹配不成功的情况都是等价的. 然后我们强制 ...

  4. django 报错 no such table: auth_user

    需要执行 python3 manage.py makemigrations python3 manage.py migrate 参考:http://arrayoverflow.com/question ...

  5. iOS自定义Navbar

    1.修改Navigationbar navigationBar其实有三个子视图,leftBarButtonItem,rightBarButtonItem,以及titleView. 1.1  方法一:a ...

  6. one day php. alomost all;

    <? namespace Test; use \PhpProject\PhpApp as Other; $u=new Other("ns test"); echo $u-&g ...

  7. scroll与按钮的位置

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. jquery插件的基本写法

    (function($){ var a={name:'2222',age:5555} var b={sex:'男',grade:5555} var c=$.extend({},a,b);//合并到新的 ...

  9. Linux 之 网络相关设置

    网络相关设置 参考教程:[千峰教育] 命令: ping: 作用:通常用于检测网络设备的连通性. 格式:ping IP/域名 选项:-c,指定方式测试数据包的次数 实例:ping www.baidu.c ...

  10. Codeforces 196C Paint Tree(贪心+极角排序)

    题目链接 Paint Tree 给你一棵n个点的树和n个直角坐标系上的点,现在要把树上的n个点映射到直角坐标系的n个点中,要求是除了在顶点处不能有线段的相交. 我们先选一个在直角坐标系中的最左下角的点 ...