Private Cells As Func(Of IWorksheet(Of BaseType); Integer; Integer; BaseType)(;)
Private CellState As BaseType(;)
Private ColCells As Func(Of IWorksheet(Of BaseType); Integer; Integer; BaseType)()
The data member CellState contains the state of the worksheet cell; and its type is BaseType;
meaning that the type of the worksheet cell is whatever BaseType is declared as。 The data members
Cells and ColCells are declared as lambda expression references; where there are three param
eters and a return value。
Before I continue with the lambda expression explanation; I want to shift focus to illustrate
a problem。 We are going to play a game of what animal am I; where we’ll use lambda expressions
in conjunction with a closure。 The idea is to store the identifier of the animal in a closure and
then return it when it’s requested。
…………………………………………………………Page 325……………………………………………………………
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 303
Dim animals(1) As Func(Of String)
Dim animal As String
animal = 〃cow〃
animals(0) = Function() animal
animal = 〃horse〃
animals(1) = Function() animal
For Each callAnimal In animals
Console。Write (〃(〃 & callAnimal() & 〃)〃)
Next
The example creates an array of lambda expressions (animals) where space for two lambda
expressions is allocated。 The individual lambda expressions will reference a variable animal;
which contains the animal of the lambda expression。 In the code; the lambda expressions are
assigned when the state of animal changes from cow to horse。
Let’s say you run the code; and Console。WriteLine() generates its output。 What do you
think the animals will be? Do you expect cow and horse; respectively? Here’s the output:
(horse) (horse)
The generated output is not what you would expect。 This demonstrates that lambda expres
sions are stateless。 Yet in earlier explanations of lambda expressions and closures; I said that
variables can be stored in lambda expressions。 Since animal is a value type; you would expect
two copies of animal; right? Wrong。
Closures do work; and variable state is kept across lambda expressions。 The mistake in this
code is that the same variable is referenced by two lambda expressions。 Thus; when the two
lambda expressions execute; they will reference the same animal; which was last assigned to be
a horse。
The code that solves the problem uses two unique variables; as follows:
Dim animals(1) As Func(Of String)
Dim animal1 = 〃cow〃
animals(0) = Function() animal1
Dim animal2 = 〃horse〃
animals(1) = Function() animal2
For Each callAnimal In animals
Console。WriteLine(callAnimal())
Next
…………………………………………………………Page 326……………………………………………………………
304 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
This time when you run the code; you get the following output。
cow
horse
Returning to the spreadsheet example; the problem is that the behavior just described
means this code won’t work:
Dim myWorksheet As IWorksheet(Of Double)
For row As Integer = 0 To 10
myWorksheet。AssignCellCalculation(row; 1; _
Function(worksheet; cellRow; cellCol) _
myWorksheet。GetCellState(row; 0) _
myWorksheet。Calculate(10; 0))
Next
whereas this code would work:
Dim myWorksheet As IWorksheet(Of Double)
For row As Integer = 0 To 10
Dim temp = row
myWorksheet。AssignCellCalculation(row; 1; _
Function(worksheet; cellRow; cellCol) _
myWorksheet。GetCellState(temp; 0) _
myWorksheet。Calculate(10; 0))
Next
The difference between the two pieces of code is that the second one has the lambda
expression that uses the variable declared temp in the context of a loop。 For each iteration of the
loop; a new instance of temp is allocated; and hence each lambda expression has its own instance
of the row。
Assigning State Without Knowing the Type
When using generics types; one of the most mon problems occurs when you need to
work with proper types。 In the implementation of the IWorksheet interface; it is necessary to
implement the AssignCellState() method defined in the interface IWorksheetSerialize。
The explanation of IWorksheetSerialize is slightly plicated and relates to the problem
of loading an IWorksheet without knowing the type。 Say that you are saving an IWorkbook with
multiple IWorksheet instances。 Each IWorksheet instance is a specific type。 When you want to
load an IWorkbook; how does the loader know which types there are? The answer is that the
loader does not; and thus must first load a general type; and then make a specific cast。 Take a
look at the serialization source code in the project Devspace。Trader。mon and the namespace
Devspace。Trader。mon。ServerSpreadsheet。SerializerImpls; available as part of the down
loadable code。
…………………………………………………………Page 327……………………………………………………………
小说推荐
- oracle从入门到精通(PDF格式)
- -Page 1-Oracle 从入门到精通-Page 2-资源来自网络,仅供学习 Oracle 从入门到精通一、SQL 8
- 最新章:第37章
- C语言游戏编程从入门到精通(PDF格式)
- -Page 1-Page 2-Page 3-Page 4-Page 5-Page 6-Page 7-Page 8-Page 9-Page 10-Page 11-Page 12-Page 13-Page 14
- 最新章:第4章
- Java编程思想第4版[中文版](PDF格式)
- -Page 1-Page 2《Thinking In Java》中文版作者:Bruce Eckel主页:http/BruceEckel.编译:Trans Bot主页:http/memberease~transbot致谢-献给那些直到现在仍在孜孜不倦创造下一代计算机语言的人们!指导您利用万维网的语言进
- 最新章:第295章
- 深入浅出MFC第2版(PDF格式)
- -Page 1-Page 2-山高月小山高月小 水落石出水落石出山高月小山高月小 水落石出水落石出-Page 3-深入淺出MFC(第版 使用Visual C 5.0 MFC 4.2)Dissecting MFC(Second Edition Using Visual C 5.0 MFC 4.2)侯俊
- 最新章:第309章
- VC语言6.0程序设计从入门到精通
- -Page 1-Visual C 6.0 程序设计从入门到精通求是科技 王正军 编著
- 最新章:第136章
- SQL 21日自学通(V3.0)(PDF格式)
- -Page 1-SQL 21 日自学通(V1.0 翻译人 笨猪目录目录 1译者的话 14第一周概貌 16从这里开始 16
- 最新章:第170章
- 2008年青年文摘精编版
- 作者:中国青年出版社“初恋”的惩罚.作者:凡 凡 文章来源《真情》2005年第4期 点击数:6608 更新时间:2005-6-5过了年,我就十八岁了。离高考只剩下四个多月了。这一段,班里的男女生相互间递纸条、写情书、约会等地下活动慢慢的多了起来。我这个“尖子生”也突然感到了不安、慌乱,并且自责。不知
- 最新章:第230章
- JMS简明教程(PDF格式)
- -Page 1-JMS1.1规范中文版卫建军2007‐11‐22-Page 2
- 最新章:第28章
- SQL语言艺术(PDF格式)
- -Page 1-SQLSSQQLL语言艺术内容介绍本书分为12章,每一章包含许多原则或准则,并通过举例的方式对原则进行解释说明。这些例子大多来自于实际案例,对九种SQL经典查询场景以及其性能影响讨论,非常便于实践,为你数据库应用维护人员阅读。资深 SQL 专家 Stéphane Faroult倾力打
- 最新章:第27章