|
public static string add RemoveNum(string num)
{
return string.Replace(num, "");
}
obviously doesnt work (Seeing as I made it up on the spot :p)
Was googling around, and couldn't find anything particularly useful...
You can't override, since it doesnt exist...
I'm just wondering if there's a way TO do it
-= Reelix =-
|
|
|
|
|
OOP way to augment functionality is inheritance, but no luck this time: String class is sealed.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
Dang :/
No evil way to hack through it? :p
-= Reelix =-
|
|
|
|
|
Of course there are ways, evil,
but you have to ask the devil.
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
|
|
|
|
|
*Decompiles the .NET Framework into Assembly*
*Inserts a new String Method*
*Recompiles*
*Looks Innocent*
*Thinks...*
Dang... Will only work on my PC
-= Reelix =-
|
|
|
|
|
check out extension methods
betonglasermur.FeedDwarf(pur_is, 17);
ProcessStartupInfo.AintNotCreateNoWindow = (false && !true) != (true || false) ? false == true ? true : false : (true != false && false);
Morgonen är tröttmans mecka
|
|
|
|
|
|
VICTORY!!!
using System;
class String
{
public string RemoveFirst(string num)
{
string toReturn = num.Remove(0, 1);
return toReturn;
}
}
class ExtMethodDemo
{
static void Main(string[] args)
{
String r1 = new String();
string r2 = r1.RemoveFirst("12345");
Console.WriteLine(r2);
Console.ReadLine();
}
}
Thanks laserbaronen!!!
-= Reelix =-
|
|
|
|
|
hmm o_o
public static class ExtMethods
{
public static string RemoveFirst(this string str)
{
return str.Remove(0,1);
}
}
class ExtMethodDemo
{
static void Main(string[] args)
{
string r1 = "12345".RemoveFirst();
Console.WriteLine(r1);
Console.ReadLine();
}
}
was thinking something like this
betonglasermur.FeedDwarf(pur_is, 17);
ProcessStartupInfo.AintNotCreateNoWindow = (false && !true) != (true || false) ? false == true ? true : false : (true != false && false);
Morgonen är tröttmans mecka
modified on Tuesday, May 20, 2008 10:05 AM
|
|
|
|
|
there is a way, using extension methods. but this requires c# 3.0 ..
Extension methods are static methods that can be invoked using instance method syntax. In effect, extension methods make it possible to extend existing types and constructed types with additional methods.
|
|
|
|
|
buchstaben wrote: In effect, extension methods make it possible
make it appear possible, when in fact it isn't.
|
|
|
|
|
PIEBALDconsult wrote: buchstaben wrote:
In effect, extension methods make it possible
make it appear possible, when in fact it isn't.
that's just what c# 3.0 specification says.
|
|
|
|
|
Hello everyone,
I understand there is no need to call Dispose explicitly when dealing with StreamReader/StreamWriter object instances since GC will take care of it in Finalizer method.
My question is, I want to know the benefits and potential issues of using "using" statement to deal with StreamReader/StreamWriter.
thanks in advance,
George
|
|
|
|
|
George_George wrote: I understand there is no need to call Dispose explicitly when dealing with StreamReader/StreamWriter object instances
you may not need to, but I would suggest its still good practice.
I always use using when dealing with stream readers/writers
using (StreamReader sr = new StreamReader(someStream))
{
...
}
|
|
|
|
|
Thanks J4amieC,
What is the benefit?
regards,
George
|
|
|
|
|
George_George wrote: What is the benefit?
Deterministic disposal. When the using statement ends, it will call Dispose(), it can reclaim the memory immediately and suppress GCs finalization.
|
|
|
|
|
|
Never leave it to the GC to take care of your cleanup. It is non-deterministic. You should take proper care to dispose of your resources.
The managed resource is automatically disposed when the control exits the using block, so you don't need to do it yourself. It is also disposed if your code exits abnormally (exception is thrown, etc).
Cheers,
Vikram.
The hands that help are holier than the lips that pray.
|
|
|
|
|
Thanks Vikram,
My current situation is, I am writing an Http Service and handle requests from client by using StreamReader in some function to read from InputStream of Http request.
My previous consideration is, even if GC is not worked determistic, or there will be exception, when the Http Service stops (process stops or terminations), all resources like native handle wrapped by StreamReader could be released automatically.
What is the benefit of using "using" statement?
regards,
George
|
|
|
|
|
George_George wrote: when the Http Service stops (process stops or terminations), all resources like native handle wrapped by StreamReader could be released automatically.
What is the benefit of using "using" statement?
When the process stops, all the native handles will be released. But if this application is expected to run for a long time, restarting it frequently to release the handles is not a good idea. using block ensures the call to Dispose() method when you come out of the block. See the following code
using(Stream str = new FileStream(..))
{
}
Stream str = null;
try
{
str = new FileStream(..);
}
finally
{
if(str != null)
((IDisposable)str).Dispose();
} Both does the same, using is a shortcut for this pattern.
Benefit will be instant memory reclaiming than waiting for GC, once you finish using the disposable instance.
|
|
|
|
|
Thanks N a v a n e e t h,
In the C# compiler expanded code, no catch block? Just a finally block?
regards,
George
|
|
|
|
|
George_George wrote: In the C# compiler expanded code, no catch block? Just a finally block?
I am not getting you
|
|
|
|
|
Thanks N a v a n e e t h,
I have found one setback of using block. It will not handle any exception in Dispose method. And if there are any exception in Dispose method, the original exception in using block will be missing.
Here is my test code. Any comments?
using System;
using System.Collections;
using System.Collections.Generic;
using System.Text;
using System.IO;
using System.Xml;
class Test
{
class MyException : ApplicationException
{
public MyException (string message)
: base(message)
{
}
}
class MyObject : IDisposable
{
public virtual void Dispose()
{
Console.WriteLine("Disposed ");
throw new MyException("Disposed exception. ");
}
}
public static void Main()
{
try
{
using (MyObject myobj = new MyObject())
{
throw new MyException("Hello World");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
}
}
regards,
George
|
|
|
|
|
using is a syntactic shortcut for try/finally pattern. I rewrote your code with try/finally for making this clear
try
{
MyObject myobj = new MyObject();
try
{
throw new MyException("Hello World");
}
finally
{
myobj.Dispose();
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
} Here it will throw MyException("Hello World") first - since we haven't defined any catch statements, corresponding finally will be executed. In this case finally also throwing error and the catch block will handle the latest exception which is disposed exception here.
The dispose pattern suggests to handle all possible exception and not to throw exceptions in the Dispose method. So you won't feel this problem anymore.
|
|
|
|
|
Thanks N a v a n e e t h!
It is in theory that the information of MyException("Hello World") is missing when there is exception in Dispose, right?
regards,
George
|
|
|
|