Tag: 参数

与c#中的值类型和引用类型混淆

我对参数有点困惑。 当我们必须使用引用参数时,何时应该使用c#中的方法/函数编程时使用值类型参数?

括号中带有(attribute)的方法参数

我有一个来自KendoUI的代码示例。 public ActionResult Customers_Read([DataSourceRequest]DataSourceRequest request) { return Json(GetCustomers().ToDataSourceResult(request)); } private static IEnumerable GetCustomers() { var northwind = new SampleEntities(); return northwind.Customers.Select( customer => new CustomerViewModel { CustomerID = customer.CustomerID, CompanyName = customer.CompanyName, ContactName = customer.ContactName, … }); } 这个例子工作正常。 我对Customers_Read方法中的[DataSourceRequest]感到困惑… 当我删除(?属性?) [DataSourceRequest] ,请求的属性为空(null)…(它们没有绑定) – >结果:filter不起作用.. 什么是[DataSourceRequest] ? 这就像属性属性? 代码示例 – > IndexController.cs代码示例

C#String.Format可选参数

我想使用带有optional parameters string.Format : public static void Main(string[] args) { //Your code goes here // Console.WriteLine(string.Format(“{0} {1}”, “a”, “b”)); Console.WriteLine(string.Format(“{0} {1}”, “a”)); } 例如,参数{1}是可选的并具有默认值 你能帮我这么做吗? 谢谢

.NET ref参数是线程安全的,还是容易受到不安全的multithreading访问?

编辑介绍: 我们知道C#中的ref参数传递对变量的引用 ,允许在被调用的方法中更改外部变量本身。 但是引用的处理方式与C指针非常相似(通过对该参数的每次访问读取原始变量的当前内容,并在对参数进行每次修改时更改原始变量),或者被调用的方法是否依赖于对该参数的一致引用通话时间? 前者提出了一些线程安全问题。 特别是: 我在C#中编写了一个静态方法,它通过引用传递一个对象: public static void Register(ref Definition newDefinition) { … } 调用者提供一个已完成但尚未注册的Definition对象,经过一些一致性检查后,我们“注册”他们提供的定义。 但是,如果已经有一个具有相同密钥的定义,则它无法注册新密钥,而是将其引用更新为该密钥的“官方” Definition 。 我们希望这是严格的线程安全,但我想到了一个病态场景。 假设客户端(使用我们的库)以非线程安全的方式共享引用,例如使用静态成员而不是局部变量: private static Definition riskyReference = null; 如果一个线程设置riskyReference = new Definition(“key 1”); ,填写定义,并调用我们的Definition.Register(ref riskyReference); 而另一个线程也决定设置riskyReference = new Definition(“key 2”); ,我们保证在我们的Register方法中,我们正在处理的newDefinition引用不会被其他线程修改(因为对象的引用被复制并在我们返回时将被复制出来吗?),或者可以线程在执行过程中替换我们上面的对象(如果我们引用指向原始存储位置的指针???),从而打破我们的理智检查? 请注意,这与对底层对象本身的更改不同,这对于引用类型(类)当然是可能的,但可以通过该类中的适当锁定来轻松防范。 但是,我们不能保护对外部客户端变量空间本身的更改! 我们必须在方法的顶部创建我们自己的参数副本并覆盖底部的参数(例如),但这对于编译器来说似乎更有意义,因为处理的是精神错乱不安全的参考。 因此,我倾向于认为引用可以被编译器复制并复制出来,以便该方法处理对原始对象的一致引用(直到它在需要时更改自己的引用),而不管是什么发生在其他线程上的原始位置。 但是我们在文档和参考参数的讨论中找不到关于这一点的确定答案。 有人可以通过明确的引用来缓解我的担忧吗? 编辑结论: 在用multithreading代码示例(感谢Marc!)确认它并进一步思考之后,它确实是我自己所担心的非自动线程安全行为。 “ref”的一点是通过引用传递大结构而不是复制它们。 另一个原因是你可能想要设置一个变量的长期监控,并且需要传递对它的引用,这将看到变量的变化(例如,在null和活动对象之间进行更改),这是一个自动复制 – in / copy-out不允许。 […]

为什么我们必须命名接口方法参数?

在C#中,我们必须命名接口方法的参数。 我明白,即使我们没有这样做,这样做也会有助于读者理解其含义,但在某些情况下,并不是真的需要: interface IRenderable { void Render(GameTime); } 我会说上面的内容与下面一样可读且有意义: interface IRenderable { void Render(GameTime gameTime); } 是否需要一些技术原因来说明接口上方法参数的名称? 值得注意的是,接口方法的实现可以使用与接口方法中的名称不同的名称。

存储过程中的多值日期参数?

我正在尝试使用一个存储过程来接受日期的多值参数。 这不是在SSRS中,但我试图使用与它相同的方法: ALTER PROCEDURE spSelectPlacementData ( @ClientID SMALLINT, @SourceFileDates VARCHAR(MAX) ) AS BEGIN SELECT (snip) FROM [APS].[dbo].[Account] A WHERE ClientID = @ClientID AND A.[SourceFileDate] IN (SELECT * FROM dbo.Split(@SourceFileDates)) END 我在SSRS报告多值参数上使用此方法和INT和VARCHAR字段。 这是我用来连接SourceFileDates的代码: string sourceFileDates = “”; foreach (DateTime file in job.sourceFiles) { if (file == job.sourceFiles.Last()) { sourceFileDates += “‘” + file.ToString(“d”) + “‘”; } […]

C#使用ThreadPool执行方法(带参数)

我们有以下代码(在本网站上找到此代码的想法),它将为方法“Do_SomeWork()”生成新线程。 这使我们能够异步多次运行该方法。 代码是: var numThreads = 20; var toProcess = numThreads; var resetEvent = new ManualResetEvent(false); for (var i = 0; i < numThreads; i++) { new Thread(delegate() { Do_SomeWork(Parameter1, Parameter2, Parameter3); if (Interlocked.Decrement(ref toProcess) == 0) resetEvent.Set(); }).Start(); } resetEvent.WaitOne(); 但是我们想要使用ThreadPool而不是创建我们自己的新线程,这可能对性能有害。 问题是如何修改上面的代码以使用ThreadPool,记住方法“Do_SomeWork”采用多个参数并且还具有返回类型(即方法不是void)。 此外,这是C#2.0。

调用者的“out”关键字的目的是什么(在C#中)?

当C#函数具有输出参数时,您可以按如下方式清除: private void f(out OutputParameterClass outputParameter); 这表明在调用函数时不必初始化参数。 但是,在调用此函数时, 您必须重复out关键字 : f(out outputParameter); 我想知道这有什么好处。 为什么有必要重复部分function规范? 有人知道吗?

如何将变量传递给另一个线程

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { Console.WriteLine(“Taking data from Main Thread\n->”); string message = Console.ReadLine(); ThreadStart newThread = new ThreadStart(delegate { Write(message); }); Thread myThread = new Thread(newThread); } public static void Write(string msg) { Console.WriteLine(msg); Console.Read(); } } }

参数计数与Invoke不匹配?

下面的代码块导致错误:TargetParameterCountException未被用户代码处理。 参数计数不匹配。 public void AddListViewItem(string[] Data) { if (InvokeRequired) { Invoke(new Action(AddListViewItem), Data); } else { ListViewData.Items.Add(Data[0]).SubItems.AddRange ( new string[] { Data[1], Data[2], Data[3], } ); } } 有任何想法吗?