我的类将自己传递给另一个类中的方法。这个外部方法(下面代码中的最后一行)改变了我相应传递的对象,返回控制,并以其快乐的方式继续。但最后一行declare @ProdChange table(ProductID int, FK_ProductID INT, FK_FinalProductID INT, ChangedBy Varchar(100))
declare @Prod table(ProductID int, ProductName Varchar(100))
insert into @Prod Values(1,'Red Bike')
insert into @Prod Values(3,'Green Bike')
insert into @ProdChange Values(1,1,3,'John')
select * from @Prod
select * from @ProdChange
SELECT
old.ProductName,
new.ProductName as FinalProductName
FROM
@Prod as old
INNER JOIN @ProdChange as link
ON old.ProductID = link.FK_ProductID
INNER JOIN @Prod as new
ON new.ProductID = link.FK_FinalProductID
在设计时说明了这一点:
无法通过'这个'作为ref或out参数,因为它是只读的***
那里没有只读属性。我该如何解决这个问题?
ThisPaymentGateway.Process(ref this);
答案 0 :(得分:3)
删除"参考"来自调用和流程方法签名
如果你只想改变对象"然后返回,无论如何你都不需要通过ref传递它。类已经是引用类型,因此如果在Process中更改对象属性,它将在源对象中更改它们。
答案 1 :(得分:1)
首先不要使用字符串而不是enum
,可能不明显,但您正在进行文化感知比较并且您正在转换{{1使用当前文化规则使用大写字母。这是什么意思?教科书示例是土耳其语语言环境:PaymentMethod
。如果您需要比较两个字符串,无论使用"ind".ToUpper() != "IND"
(这里我假设,因为一个字符串是硬编码的,您希望使用不变的文化规则进行比较,但也可能是顺序比较)。
在C#中,您不需要以这种方式声明命名空间,此语法有效:
String.Equals(PaymentMethod, "IND", StringComparer.InvariantCultureIgnoreCase)
关于您的问题:使用namespace Something.Finance.Donations {
}
传递的变量可能已更改。这个(让我们想象它是一个变量,想象一下......)显然无法改变,那么你就有了编译错误。
阅读本文:
ref
将它们视为指向变量的指针,而不是该变量的值(在C#参数中按值传递,您需要static void ChangeAnimalWithRef(ref Animal animal) {
animal = new Cat();
Debug.Assert(animal.GetType() == typeof(Cat));
}
static void ChangeAnimalWithoutRef(Animal animal) {
animal = new Cat();
Debug.Assert(animal.GetType() == typeof(Cat));
}
void Test1() {
Animal animal = new Dog();
Debug.Assert(animal.GetType() == typeof(Dog));
ChangeAnimalWith(ref animal);
Debug.Assert(animal.GetType() == typeof(Cat));
}
void Test2() {
Animal animal = new Dog();
Debug.Assert(animal.GetType() == typeof(Dog));
ChangeAnimalWithoutRef(animal);
Debug.Assert(animal.GetType() == typeof(Dog));
}
和ref
通过引用传递它们。)
如果你拥有out
方法,我敢打赌你不需要ThisPaymentGateway.Process()
修饰符而你只需使用来使用{{{c>引用ref
1}}。在C#中,事情是不同的。
如果由于任何不明原因,您不拥有该方法且其签名无法更改,那么您有两种选择:
1)创建一个虚拟变量:
&
2)从课外调用该函数(并稍微改变你的逻辑):
Electronic1 dummy = this;
ThisPaymentGateway.Process(ref dummy);
Debug.Assert(Object.ReferenceEquals(dummy, this), "Ooops, what are we supposed to do?");
我强烈怀疑你需要其中任何一个,这只是为了完整。