Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C#
  4. maximum number of methods supported in C# class

maximum number of methods supported in C# class

Scheduled Pinned Locked Moved C#
questioncsharp
32 Posts 13 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • V vytheese

    Just curiosity ;) , Did anyone have idea of how many methods a single C# class can allow ? I heard, it is compiler dependent If true, what is the maximum no allowed by the standard compiler ? Thanks, Vythees

    L Offline
    L Offline
    Luc Pattyn
    wrote on last edited by
    #8

    when in trouble, switch to Win64. :)

    Luc Pattyn [My Articles] [Forum Guidelines]

    V 1 Reply Last reply
    0
    • C Colin Angus Mackay

      vytheeswaran wrote:

      Did anyone have idea of how many methods a single C# class can allow ?

      I think that if you ever reached that limit then you might want to seriously reconsider your design.


      Upcoming events: * Glasgow: Mock Objects, SQL Server CLR Integration, Reporting Services, db4o, Dependency Injection with Spring ... "I wouldn't say boo to a goose. I'm not a coward, I just realise that it would be largely pointless." Ready to Give up - Your help will be much appreciated. My website

      L Offline
      L Offline
      led mike
      wrote on last edited by
      #9

      Colin Angus Mackay wrote:

      I think that if you ever reached that limit then you might want to seriously reconsider your design.

      or the switch/case limit or the if/elseif limit or the .... or if none of that makes sense to you try this[^]

      V 1 Reply Last reply
      0
      • L leppie

        Seeing Assembly metatokens takes the following form: 00 000000, where the former is the type, and the latter is the code, I would say the maximum number of methoddef's in an assembly would be limited to 24-bits, iow 16.7 million. Dunno if there is a limitation on a classes though.

        **

        xacc.ide-0.2.0.75 - now with C# 3.5 support and Navigation Bar!

        **

        V Offline
        V Offline
        vytheese
        wrote on last edited by
        #10

        A nice research. Thanks, Vythees

        L 1 Reply Last reply
        0
        • V vytheese

          Thanks for Info, But I read in one article that E-Bay once hits the compiler limit in max number of methods in single class. Thanks, Vythees

          D Offline
          D Offline
          Dan Neely
          wrote on last edited by
          #11

          IIRC ebay is running its servers using c++ and ISAPI, not .net.

          -- You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer

          V 1 Reply Last reply
          0
          • L Luc Pattyn

            when in trouble, switch to Win64. :)

            Luc Pattyn [My Articles] [Forum Guidelines]

            V Offline
            V Offline
            vytheese
            wrote on last edited by
            #12

            Fiction : :) I may end up with Portablity issues with 32bit cousins. Not an real issue, but just to know the number. :wtf: Thanks, Vythees

            1 Reply Last reply
            0
            • D Dan Neely

              IIRC ebay is running its servers using c++ and ISAPI, not .net.

              -- You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer

              V Offline
              V Offline
              vytheese
              wrote on last edited by
              #13

              I agree, I think then there should be the same constraint exist in .NET class also. Thanks, Vythees

              D 1 Reply Last reply
              0
              • L led mike

                Colin Angus Mackay wrote:

                I think that if you ever reached that limit then you might want to seriously reconsider your design.

                or the switch/case limit or the if/elseif limit or the .... or if none of that makes sense to you try this[^]

                V Offline
                V Offline
                vytheese
                wrote on last edited by
                #14

                Oh God, thats classic link. :) Thanks, Vythees

                1 Reply Last reply
                0
                • L leppie

                  Seeing Assembly metatokens takes the following form: 00 000000, where the former is the type, and the latter is the code, I would say the maximum number of methoddef's in an assembly would be limited to 24-bits, iow 16.7 million. Dunno if there is a limitation on a classes though.

                  **

                  xacc.ide-0.2.0.75 - now with C# 3.5 support and Navigation Bar!

                  **

                  E Offline
                  E Offline
                  Ed Poore
                  wrote on last edited by
                  #15

                  There is a limit, I remember someone a while ago (I've got a feeling in this forum) hit a limit on the number of fields in anycase that they could include in a class.  Buggered if I can remember where it was or what it was :sigh:


                  My Blog

                  L 1 Reply Last reply
                  0
                  • V vytheese

                    A nice research. Thanks, Vythees

                    L Offline
                    L Offline
                    leppie
                    wrote on last edited by
                    #16

                    Not research, I know it from working with the spec :) And those values can be accessed from .NET 2 (nowadays).

                    **

                    xacc.ide-0.2.0.75 - now with C# 3.5 support and Navigation Bar!

                    **

                    1 Reply Last reply
                    0
                    • E Ed Poore

                      There is a limit, I remember someone a while ago (I've got a feeling in this forum) hit a limit on the number of fields in anycase that they could include in a class.  Buggered if I can remember where it was or what it was :sigh:


                      My Blog

                      L Offline
                      L Offline
                      leppie
                      wrote on last edited by
                      #17

                      Maybe you are thinking about the parameter limit, that is 16383/4.

                      **

                      xacc.ide-0.2.0.75 - now with C# 3.5 support and Navigation Bar!

                      **

                      E 1 Reply Last reply
                      0
                      • L leppie

                        Maybe you are thinking about the parameter limit, that is 16383/4.

                        **

                        xacc.ide-0.2.0.75 - now with C# 3.5 support and Navigation Bar!

                        **

                        E Offline
                        E Offline
                        Ed Poore
                        wrote on last edited by
                        #18

                        No, I'm pretty sure that someone managed to hit a limit on the number of fields that could be contained in a class.  I'll do some digging.


                        My Blog

                        1 Reply Last reply
                        0
                        • V vytheese

                          Just curiosity ;) , Did anyone have idea of how many methods a single C# class can allow ? I heard, it is compiler dependent If true, what is the maximum no allowed by the standard compiler ? Thanks, Vythees

                          S Offline
                          S Offline
                          Sean Michael Murphy
                          wrote on last edited by
                          #19

                          I let this run for an hour to get to 5000 before I gave up. Someone with more CPU and physical RAM than I have should run it and see where it ends...

                          using System;
                          using System.Collections.Generic;
                          using System.Text;
                          using System.CodeDom.Compiler;
                             
                          namespace MethodCountLimitFinder {
                             class Program {
                                static void Main(string[] args) {
                                   Int32 methodCount = 1;
                                   Microsoft.CSharp.CSharpCodeProvider cscp = new Microsoft.CSharp.CSharpCodeProvider();
                                   ICodeCompiler icc = cscp.CreateCompiler();
                             
                                   CompilerParameters cp = new CompilerParameters();
                                   cp.GenerateExecutable = false;
                                   cp.GenerateInMemory = true;
                             
                                   CompilerResults cr = null;
                                   string pre = "using System;" + Environment.NewLine +
                                            Environment.NewLine +
                                            "namespace Tester {" + Environment.NewLine +
                                            " class Test {" + Environment.NewLine;
                                   string post = " }" + Environment.NewLine +
                                            "}";
                                   string inner = string.Empty;
                             
                                   while (true) {
                                      inner += " public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine +
                                               " return 42;" + Environment.NewLine +
                                               " }" + Envi

                          D P 2 Replies Last reply
                          0
                          • S Sean Michael Murphy

                            I let this run for an hour to get to 5000 before I gave up. Someone with more CPU and physical RAM than I have should run it and see where it ends...

                            using System;
                            using System.Collections.Generic;
                            using System.Text;
                            using System.CodeDom.Compiler;
                               
                            namespace MethodCountLimitFinder {
                               class Program {
                                  static void Main(string[] args) {
                                     Int32 methodCount = 1;
                                     Microsoft.CSharp.CSharpCodeProvider cscp = new Microsoft.CSharp.CSharpCodeProvider();
                                     ICodeCompiler icc = cscp.CreateCompiler();
                               
                                     CompilerParameters cp = new CompilerParameters();
                                     cp.GenerateExecutable = false;
                                     cp.GenerateInMemory = true;
                               
                                     CompilerResults cr = null;
                                     string pre = "using System;" + Environment.NewLine +
                                              Environment.NewLine +
                                              "namespace Tester {" + Environment.NewLine +
                                              " class Test {" + Environment.NewLine;
                                     string post = " }" + Environment.NewLine +
                                              "}";
                                     string inner = string.Empty;
                               
                                     while (true) {
                                        inner += " public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine +
                                                 " return 42;" + Environment.NewLine +
                                                 " }" + Envi

                            D Offline
                            D Offline
                            DavidNohejl
                            wrote on last edited by
                            #20

                            Sean Michael Murphy wrote:

                            while (true) { inner += " public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine + " return 42;" + Environment.NewLine + " }" + Environment.NewLine; cr = icc.CompileAssemblyFromSource(cp, pre + inner + post); if (cr.Errors.Count > 0) break; methodCount++; if (methodCount % 10 == 0) System.Console.WriteLine(methodCount.ToString()); }

                            Sean Michael Murphy wrote:

                            Someone with more CPU and physical RAM than I have should run it and see where it ends...

                            No wonder, always use StringBuilder for string concatenation in a loop.


                            "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe

                            M S 2 Replies Last reply
                            0
                            • V vytheese

                              I agree, I think then there should be the same constraint exist in .NET class also. Thanks, Vythees

                              D Offline
                              D Offline
                              Dan Neely
                              wrote on last edited by
                              #21

                              Even assuming there is a constraint, you're talking about 2 totally different languages so why should they be the same?

                              -- You have to explain to them [VB coders] what you mean by "typed". their first response is likely to be something like, "Of course my code is typed. Do you think i magically project it onto the screen with the power of my mind?" --- John Simmons / outlaw programmer

                              1 Reply Last reply
                              0
                              • D DavidNohejl

                                Sean Michael Murphy wrote:

                                while (true) { inner += " public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine + " return 42;" + Environment.NewLine + " }" + Environment.NewLine; cr = icc.CompileAssemblyFromSource(cp, pre + inner + post); if (cr.Errors.Count > 0) break; methodCount++; if (methodCount % 10 == 0) System.Console.WriteLine(methodCount.ToString()); }

                                Sean Michael Murphy wrote:

                                Someone with more CPU and physical RAM than I have should run it and see where it ends...

                                No wonder, always use StringBuilder for string concatenation in a loop.


                                "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe

                                M Offline
                                M Offline
                                Martin 0
                                wrote on last edited by
                                #22

                                Cannot been said to often! Good answere!

                                P 1 Reply Last reply
                                0
                                • M Martin 0

                                  Cannot been said to often! Good answere!

                                  P Offline
                                  P Offline
                                  PIEBALDconsult
                                  wrote on last edited by
                                  #23

                                  Well it can be said too often, but it's appropriate here.

                                  1 Reply Last reply
                                  0
                                  • D DavidNohejl

                                    Sean Michael Murphy wrote:

                                    while (true) { inner += " public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine + " return 42;" + Environment.NewLine + " }" + Environment.NewLine; cr = icc.CompileAssemblyFromSource(cp, pre + inner + post); if (cr.Errors.Count > 0) break; methodCount++; if (methodCount % 10 == 0) System.Console.WriteLine(methodCount.ToString()); }

                                    Sean Michael Murphy wrote:

                                    Someone with more CPU and physical RAM than I have should run it and see where it ends...

                                    No wonder, always use StringBuilder for string concatenation in a loop.


                                    "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe

                                    S Offline
                                    S Offline
                                    Sean Michael Murphy
                                    wrote on last edited by
                                    #24

                                    dnh wrote:

                                    No wonder, always use StringBuilder for string concatenation in a loop.

                                    Hmmm. Interesting. When I originally undertook to code this snippet to try to figure an answer to this guys question, optimization was pretty far from my mind. I mean, I cranked the original bit of code out in 15 minutes (or so) and had originally coded it so the methods would be recreated every time. I took another 5 minutes and optimized it so that only 1 method (the new one) would have to be concatenated to the "guts", which was then stuck in between the fixed "header" and "footer" of the class. It ran slowly, but I assumed that most of the overhead was in the actual code compilation (compiling classes of 15000 lines), and not a little bit of string concatenation. So I've re-written it using StringBuilder and timed both versions for 500 iterations. The original code did 500 iterations on my PC in 161.5222 seconds. This version:

                                    StringBuilder inner = new StringBuilder();
                                     
                                    DateTime startTime = DateTime.Now;
                                       
                                    for (Int32 i = 0; i < 500; i++) {
                                       inner.Append(" public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine +
                                                    " return 42;" + Environment.NewLine +
                                                    " }" + Environment.NewLine);
                                     
                                       StringBuilder code = new StringBuilder(pre);
                                       code.Append(inner);
                                       code.Append(post);
                                       cr = icc.CompileAssemblyFromSource(cp, code.ToString());
                                     
                                       if (cr.Errors.Count > 0)
                                          break;
                                     
                                       methodCount++;
                                     
                                       if (methodCount % 10 == 0)
                                          System.Console.WriteLine(methodCount.ToString());
                                    }
                                     
                                    TimeSpan ts = DateTime.Now - startTime;
                                     
                                    System.Console.WriteLine(ts.TotalSeconds);

                                    did it in 160.111. Much less that 1% slower. Not a string concatenation to be found, except for the line joins. Anything to add? Thanks. Sean

                                    D V 2 Replies Last reply
                                    0
                                    • S Sean Michael Murphy

                                      dnh wrote:

                                      No wonder, always use StringBuilder for string concatenation in a loop.

                                      Hmmm. Interesting. When I originally undertook to code this snippet to try to figure an answer to this guys question, optimization was pretty far from my mind. I mean, I cranked the original bit of code out in 15 minutes (or so) and had originally coded it so the methods would be recreated every time. I took another 5 minutes and optimized it so that only 1 method (the new one) would have to be concatenated to the "guts", which was then stuck in between the fixed "header" and "footer" of the class. It ran slowly, but I assumed that most of the overhead was in the actual code compilation (compiling classes of 15000 lines), and not a little bit of string concatenation. So I've re-written it using StringBuilder and timed both versions for 500 iterations. The original code did 500 iterations on my PC in 161.5222 seconds. This version:

                                      StringBuilder inner = new StringBuilder();
                                       
                                      DateTime startTime = DateTime.Now;
                                         
                                      for (Int32 i = 0; i < 500; i++) {
                                         inner.Append(" public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine +
                                                      " return 42;" + Environment.NewLine +
                                                      " }" + Environment.NewLine);
                                       
                                         StringBuilder code = new StringBuilder(pre);
                                         code.Append(inner);
                                         code.Append(post);
                                         cr = icc.CompileAssemblyFromSource(cp, code.ToString());
                                       
                                         if (cr.Errors.Count > 0)
                                            break;
                                       
                                         methodCount++;
                                       
                                         if (methodCount % 10 == 0)
                                            System.Console.WriteLine(methodCount.ToString());
                                      }
                                       
                                      TimeSpan ts = DateTime.Now - startTime;
                                       
                                      System.Console.WriteLine(ts.TotalSeconds);

                                      did it in 160.111. Much less that 1% slower. Not a string concatenation to be found, except for the line joins. Anything to add? Thanks. Sean

                                      D Offline
                                      D Offline
                                      DavidNohejl
                                      wrote on last edited by
                                      #25

                                      Sean Michael Murphy wrote:

                                      Anything to add?

                                      I'd agree that most time takes compilation, but the thing about string concatenation with + is that it's -unlike compilation - completely unnecessary. And I don't think that using StringBuilder for concatenating strings in big loops is optimalization - I think it's something you should do without thinking. btw you're still allocating 7 or so strings in

                                      inner.Append("      public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine +
                                                      "         return 42;" + Environment.NewLine +
                                                      "      }" + Environment.NewLine);
                                      

                                      every cycle, that's 3500 unnecessary allocations :) Anyway, cool way to check for number of methods limit indeed.


                                      "Throughout human history, we have been dependent on machines to survive. Fate, it seems, is not without a sense of irony. " - Morpheus "Real men use mspaint for writing code and notepad for designing graphics." - Anna-Jayne Metcalfe

                                      P 1 Reply Last reply
                                      0
                                      • S Sean Michael Murphy

                                        dnh wrote:

                                        No wonder, always use StringBuilder for string concatenation in a loop.

                                        Hmmm. Interesting. When I originally undertook to code this snippet to try to figure an answer to this guys question, optimization was pretty far from my mind. I mean, I cranked the original bit of code out in 15 minutes (or so) and had originally coded it so the methods would be recreated every time. I took another 5 minutes and optimized it so that only 1 method (the new one) would have to be concatenated to the "guts", which was then stuck in between the fixed "header" and "footer" of the class. It ran slowly, but I assumed that most of the overhead was in the actual code compilation (compiling classes of 15000 lines), and not a little bit of string concatenation. So I've re-written it using StringBuilder and timed both versions for 500 iterations. The original code did 500 iterations on my PC in 161.5222 seconds. This version:

                                        StringBuilder inner = new StringBuilder();
                                         
                                        DateTime startTime = DateTime.Now;
                                           
                                        for (Int32 i = 0; i < 500; i++) {
                                           inner.Append(" public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine +
                                                        " return 42;" + Environment.NewLine +
                                                        " }" + Environment.NewLine);
                                         
                                           StringBuilder code = new StringBuilder(pre);
                                           code.Append(inner);
                                           code.Append(post);
                                           cr = icc.CompileAssemblyFromSource(cp, code.ToString());
                                         
                                           if (cr.Errors.Count > 0)
                                              break;
                                         
                                           methodCount++;
                                         
                                           if (methodCount % 10 == 0)
                                              System.Console.WriteLine(methodCount.ToString());
                                        }
                                         
                                        TimeSpan ts = DateTime.Now - startTime;
                                         
                                        System.Console.WriteLine(ts.TotalSeconds);

                                        did it in 160.111. Much less that 1% slower. Not a string concatenation to be found, except for the line joins. Anything to add? Thanks. Sean

                                        V Offline
                                        V Offline
                                        vytheese
                                        wrote on last edited by
                                        #26

                                        Hi, while( true) { do { inner.Append(" public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine + " return 42;" + Environment.NewLine + " }" + Environment.NewLine); methodCount++; } while ((methodCount % 1000) != 0); cr = icc.CompileAssemblyFromSource(cp, pre + inner.ToString() + post); if (cr.Errors.Count > 0) break; System.Console.WriteLine(methodCount.ToString() + " Compiled successfuly ==> so not succed"); } System.Console.WriteLine(methodCount + " may be approximately to -1000 of method count"); I modified slightly your code as the above and executed, Its going on till 100000 ( above 1 lakh ), My machine got down, So I planned to run today night. Now I feeling, I shouldn't ask this question first of all ;) Thanks, Vythees -- modified at 5:24 Tuesday 3rd July, 2007 Thanks, Vythees

                                        S 1 Reply Last reply
                                        0
                                        • V vytheese

                                          Hi, while( true) { do { inner.Append(" public Int32 Method" + methodCount.ToString() + "() {" + Environment.NewLine + " return 42;" + Environment.NewLine + " }" + Environment.NewLine); methodCount++; } while ((methodCount % 1000) != 0); cr = icc.CompileAssemblyFromSource(cp, pre + inner.ToString() + post); if (cr.Errors.Count > 0) break; System.Console.WriteLine(methodCount.ToString() + " Compiled successfuly ==> so not succed"); } System.Console.WriteLine(methodCount + " may be approximately to -1000 of method count"); I modified slightly your code as the above and executed, Its going on till 100000 ( above 1 lakh ), My machine got down, So I planned to run today night. Now I feeling, I shouldn't ask this question first of all ;) Thanks, Vythees -- modified at 5:24 Tuesday 3rd July, 2007 Thanks, Vythees

                                          S Offline
                                          S Offline
                                          Sean Michael Murphy
                                          wrote on last edited by
                                          #27

                                          vytheeswaran wrote:

                                          Now I feeling, I shouldn't ask this question first of all

                                          Don't be crazy. I enjoyed thinking about it. Sean

                                          1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Categories
                                          • Recent
                                          • Tags
                                          • Popular
                                          • World
                                          • Users
                                          • Groups