问题#1:在循环中声明一个变量是一个好习惯还是坏习惯?
我已经阅读了其他关于是否存在性能问题的线程(大多数说没有),并且您应该始终将变量声明为接近它们将被使用的位置.我想知道的是,这是否应该避免,或者它是否真的是首选.
例:
for(int counter = 0; counter <= 10; counter++)
{
string someString = "testing";
cout << someString;
}
Run Code Online (Sandbox Code Playgroud)
问题2:大多数编译器是否已经声明变量已经被声明并且只是跳过了那个部分,或者它实际上每次都在内存中为它创建了一个位置?
我创建了一个EF4.1代码优先模型(可能重要也可能不重要),我正在尝试获取我的创建脚手架模板的默认值.我的模型看起来像:
class Person {
[DefaultValue (18)]
public int Age { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
然后我的Create视图看起来像:
<div class="editor-label">
@Html.LabelFor(model => model.Age)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Age)
@Html.ValidationMessageFor(model => model.Age)
</div>
Run Code Online (Sandbox Code Playgroud)
我希望在运行时,EditorFor会用"18"预先填充文本框,但它没有这样的东西.我误解了DefaultValue属性的用途,还是我应该做的其他事情?
注意:我不想new { Value = "18" }
在EditorFor方法上使用覆盖,它似乎打破了DRY.
作为编写流畅API的实践,我想我会进行以下编译和运行:
static void Main(string[] args)
{
Enumerable.Range(1, 100)
.When(i => i % 3 == 0).Then(i => Console.WriteLine("fizz"))
.When(i => i % 5 == 0).Then(i => Console.WriteLine("buzz"))
.Otherwise(i => Console.WriteLine(i))
.Run();
Console.ReadLine();
}
Run Code Online (Sandbox Code Playgroud)
这个想法.When
将测试枚举中的每个元素,如果它通过谓词,则运行该动作.如果谓词失败,则项目沿着链传递.
我想出的图是:
public static class EnumerableExtensions
{
public static IConditionalEnumerable<T> When<T>(this IEnumerable<T> items, Predicate<T> test, Action<T> action)
{
}
public static IResolvedEnumerable<T> Then<T>(this IConditionalEnumerable<T> items, Predicate<T> test, Action<T> action)
{
}
public static void Run<T>(this IEnumerable<T> items)
{
foreach (var item in items) ;
}
} …
Run Code Online (Sandbox Code Playgroud) 我可能会误解代码合同,但这是我的情况.
我有以下代码:
interface IFetch<T> // defined in another DLL
{
T Fetch(int id);
}
interface IUserFetch : IFetch<User>
{
IEnumerable<User> GetUsersLoggedIn ();
}
class UserFetch : IUserFetch
{
public User Fetch(int id)
{
return (User) Database.DoStuff (id);
}
public IEnumerable<User> GetUsersLoggedIn ()
{
return (IEnumerable<User>) Database.DoMoreStuff ();
}
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试添加一个相对简单的合同: Contract.Requires (id != 0);
,我想要验证它Fetch
.当我直接将其添加到Fetch时,我会收到警告Method Fetch(int id) implements interface 3rdParty.IFetch<User> and thus cannot add Requires
.
我创建了一个实现IFetch的抽象代码契约类,ContractClass
并ContractClassFor
分别使用和属性将其指向/从UserFetch .我仍然得到一个错误CodeContracts: The class 'FetchUserContracts' is …
示例程序如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace GenericsTest
{
class Program
{
static void Main(string[] args)
{
IRetrievable<int, User> repo = new FakeRepository();
Console.WriteLine(repo.Retrieve(35));
}
}
class User
{
public int Id { get; set; }
public string Name { get; set; }
}
class FakeRepository : BaseRepository<User>, ICreatable<User>, IDeletable<User>, IRetrievable<int, User>
{
// why do I have to implement this here, instead of letting the
// TKey generics implementation in the baseclass handle it?
//public User …
Run Code Online (Sandbox Code Playgroud) 我在VP9/H.265中编码4k视频,并希望将它们流式传输到浏览器.如何以最大数量的浏览器支持的方式执行此操作?
我有这样的URL方案:
website.com/keywords
Run Code Online (Sandbox Code Playgroud)
我也有特定的控制器:
website.com/controller/action
Run Code Online (Sandbox Code Playgroud)
有时,关键字可能看起来很像控制器URL,或者对它们有某种"/ url/thingy".所有关键字URL都将存储在数据库中并返回静态内容.我希望能够做的是,首先让"关键字"控制器匹配(它只使用{*}),如果在数据库中找不到URL,则弹回到路由器,然后让匹配继续.
我现在有一个解决方法,它将通用匹配路由器置于最后,并将302重定向到适当的控制器,但这是一个更长的往返时间,如果我可以弹出,则不需要.
背景:我和我的同事正在维护我们继承的百万行遗留应用程序.它的前端是用VB6编写的,当我们将几乎所有的资源用于将其转换为C#时,我们正在为我们的特定问题寻找快速而肮脏的解决方案.
应用程序以插件方式运行.最多可以在网格样式的布局中同时加载20个单独的ActiveX控件.问题是ActiveX控件在他们自己的UI线程上完成所有处理,并且由于很多阻止等待网络访问,UI变得非常浓.当我们的托管C#应用程序加载这些控件时,它变得没有响应,因为有多少控件正在咀嚼UI资源什么都不做.最重要的是,控件很脆弱,在最轻微的挑衅时会崩溃.当它们在主C#应用程序中托管时,会造成严重的不稳定性.
到目前为止,我和我最好的同事是根据ActiveX控件启动一个进程.这个过程,我们称之为代理,是另一个winforms应用程序.它使用命名管道与托管进程进行通信.托管过程创建一个窗口,加载我们选择的ActiveX控件(通过一些反射和AxHost魔术),并通过命名管道告诉主过程它的窗口句柄是什么.主进程使用SetParent和SetWindowPos的组合将代理应用程序移动到自身中以模拟插件.通过命名管道发送大小更新.
这很有效,直到ActiveX应用程序执行某种冗长的过程,我们在主窗口工作时点击它.有一段时间,主窗口是响应式的,但最终它会在子窗口等待其UI线程时变得无响应.我们怎样才能让子窗口保持自己的完整线程,同时还能获得SetParent的好处?
(如果有什么不清楚,请告诉我!)
我想在我的应用程序中集成Tasks
类使用,因为我知道完成我的requeriments,因为我只需要启动一个非常简单的异步操作来调用安全的WinAPI方法,然后如果我使用后台工作程序将是一个非常庞大的解决方案,只是在我的意见中疯狂只是以这种方式运行一条指令:
Task.Factory.StartNew(Sub() NativeMethods.SomeWrapper)
Run Code Online (Sandbox Code Playgroud)
我需要每分钟多次执行该指令(如100),但我不能等待异步操作完成并使用该Wait
方法处理对象,因为即使当前Task
是活动的,我的意图是启动另一个Task
实例相同的操作,让旧任务仍然有效,所以我不知道当每个任务完成时是否GarbageCollector
会Task
自动处理我的对象,或者我需要使用Dispose
方法手动处理每个对象?在这种情况下我很丢失'因为我不知道如何在这个环境中提到我.
我对这种方法有点困惑,我已经尝试过好奇这个非常简单的测试,每次我执行这个循环时,内存增加大约20 mb在我的情况下,我没有看到消费从未被处理掉,无论如何,我不是一个探查器专家,但是因为所有.NET专家都知道vb.net应用程序的内存消耗指标可能效率非常低,所以即使使用下面的这个小测试,我仍然可以使用它:
For x As Integer = 0 To 99999
Task.Factory.StartNew(Sub() NativeSafeMethods.SomeSafeWrapper)
Next
Run Code Online (Sandbox Code Playgroud)
请有人让我不相信.
我正在尝试绘制这个(空心)形状:
圆圈实际上是不同的直径,我想像这样将连接管的中间缩进(但这不是必需的)。我可以通过逐段绘制来伪造形状,但是我在缩小它时遇到了问题,而且感觉不像 OpenSCAD 想要它那样完成(即长达一小时的 CSG 生成)。有没有更好的方法来做到这一点?:
for(i = [0:180]) {
rotate([0,i,0])
translate([26,0,0])
difference() {
cylinder(r=10 + (0.083 * i),h=.1);
cylinder(r=8 + (0.083 * i),h=.1);
}
}
Run Code Online (Sandbox Code Playgroud)