additional rules regarding grammar。 When using generics; you need to master creating abstractions。 generics are an abstraction。 Just as interfaces are an abstraction of classes; generics are an abstraction above interfaces。 Interfaces define an intention; and generics define an abstract implemen tation of an intention。 What is challenging with generics is getting your thoughts together into an abstract intention implementation。 It is like writing a document—you write it once; read it over; rewrite it; read it over; and rewrite it again。 With generics; you are gathering thoughts together into a general plan of action。 This is why some people are pletely confused and don’t understand generics。 Writing your own generics code requires some forethought。 The Theory of a Server…Side Spreadsheet The example in this chapter is a spreadsheet for security traders。 When you trade securities— whether they are equities; bonds; options; or futures—you will be confronted with information overload。 You might have seen pictures of traders with desks full of desktop monitors。 A trader might have seven to eight monitors displaying various bits of information。 A trader is a very specialized type of domain that requires its own ways of processing information。 One aspect that makes writing applications for traders difficult is that the nature of the data constantly changes; and types get more in the way than they help。 As a result; traders adore spreadsheets。 Spreadsheets are useful because they can process large amounts of information in a relatively ad hoc manner。 However; one downside to spreadsheets is that the processing time can …………………………………………………………Page 311…………………………………………………………… CH AP T E R 1 1 ■ L E A R N IN G AB O U T 。 N E T G E N E R I CS 289 dramatically increase due to the constant pushing and pulling of the data to and from the spreadsheet。 To speed up processing; we will define and implement a spreadsheet that has the advantages of a traditional client…side spreadsheet。 ■Note The theory and solution presented here are specific to the domain of trading; where the cost of hard ware is well worth the ability to trade properly。 Therefore; specific design aspects assume that you have the latest and greatest hardware。 An initial attempt at a spreadsheet would be the following code that uses generics: Class Spreadsheet Public Cells As Func(Of Object)(;) Public State As Object(;) Public Sub New() Cells = New Func(Of Object)(10; 10) {} State = New Object(10; 10) {} End Sub Public Sub Execute() For col As Integer = 0 To Cells。GetLength(1) 1 For row As Integer = 0 To Cells。GetLength(0) 1 Console。WriteLine(col & 〃 〃 & 〃 〃 & row) If Cells(row; col) IsNot Nothing Then State(row; col) = Cells(row; col)() End If Next Next End Sub End Class The sample spreadsheet is defined using the data members Cells and State。 Both data members are arrays with two dimensions。 The first dimension represents the rows; and the second dimension represents the columns。 You could define as many dimensions as you wish; but for the scope of the server spreadsheet; we take a two…dimensional approach。 The Execute() method goes through the individual rows and columns of the Cells data member; calculates the state of the cell; and assigns the state to the State data member。 The data member Cells represents a function that is executed to generate the result of a particular cell that is assigned to the data member State。 Both data members store and manipulate Objects; which makes the spreadsheet flexible。 However; a gain in one aspect means a reduction in another aspect; in this case; the loss is in performance。 But performance is what algorithmic trading software cannot sacrifice; and native types would be best。 To make the spreadsheet perform as fast as it can; we need to use fixed…dimension arrays。 However; with fixed…dimension arrays; we are moving away from a traditional object…oriented …………………………………………………………Page 312…………………………………………………………… 290 CH AP T E R 1 1 ■ L E A R N I N G A B OU T 。 N E T G E N E R I CS approach。 You could argue that spreadsheets are not object…oriented at all and are a problem with respect to programmability。 I would agree with that ment; but spreadsheets solve one class of problems very elegantly。 In the case of financial trading software; they solve the problem of managing very large amounts of data efficiently。 ■Note Object…oriented code is maintainable and extendable。 However; object…oriented code can be slow。 I have done tests where I found fixed…dimension arrays perform two to three times faster than the equivalent object…oriented application。 But performance is not always the primary consideration。 Also; fixed…dimension arrays will not always give you the desired performance boost; because other parts of your code might be much slower。 Therefore; generally; you should not use fixed…dimension arrays。 The Cells data member is a delegate; or lambda expression; that is defined using code similar to the following。 When we want to fill a cell; we call the appropriate function on CellFactories; which in turn returns the lambda expression that represents the new value stored in the cell: Module CellFactories